{
  "openapi": "3.1.0",
  "jsonSchemaDialect": "http://json-schema.org/draft-07/schema#",
  "info": {
    "title": "Goosy Bear API",
    "version": "1.0.0-beta",
    "summary": "Manage workspace content, projects, Data tables, Pages, library and credits.",
    "description": "BETA. This API is in beta: paths, request shapes and response envelopes may change, and every response carries an `x-goosy-api: beta` header for as long as that is true. A change is additive, or it is deprecated first: a response to a call that uses a deprecated feature carries `Deprecation` and `Sunset` headers, and nothing is removed until at least 90 days after its deprecation. Pin the OpenAPI document you generated against and re-generate when it changes."
  },
  "servers": [
    {
      "url": "https://app.goosybear.ai",
      "description": "Production"
    }
  ],
  "security": [
    {
      "tenantApiKey": []
    }
  ],
  "components": {
    "securitySchemes": {
      "tenantApiKey": {
        "type": "http",
        "scheme": "bearer",
        "description": "An API key minted at Settings › API & MCP. Send it as `Authorization: Bearer <key>`. A key carries its holder's own permissions, resolved on every call — revoking a membership closes the key's reach immediately. Keep it in an environment variable (`GOOSY_API_KEY`), never in a committed file."
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": false
          },
          "code": {
            "type": "string",
            "description": "The typed refusal code — e.g. `tenant_mcp.surface_disabled`, `tenant_mcp.rate_limited`."
          },
          "message": {
            "type": "string",
            "description": "A sentence a person can act on."
          },
          "retry_after_seconds": {
            "description": "On a 429: whole seconds to wait. Mirrors `Retry-After`.",
            "type": "number"
          },
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "retry_after_seconds": {
                "type": "number"
              }
            },
            "required": [
              "code",
              "message"
            ],
            "description": "Deprecated: the same values as the top-level fields, kept until 2026-12-31. Read `code` and `message` at the top level.",
            "additionalProperties": false
          }
        },
        "required": [
          "ok",
          "code",
          "message",
          "error"
        ],
        "description": "A request the boundary refused before dispatching anything. The same shape the MCP endpoint answers its own refusals with, and the same top-level fields a dispatched call's refusal carries, so one client branch covers both.",
        "additionalProperties": false
      },
      "ToolRefusal": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": false
          },
          "code": {
            "type": "string",
            "description": "The typed reason — e.g. `workspace_ambiguous`, `invalid_arguments`, or the tool's own failure code."
          },
          "message": {
            "type": "string",
            "description": "A sentence a person can act on."
          },
          "workspaces": {
            "description": "On a workspace refusal: the slugs this key may pass as `workspace`.",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "issues": {
            "description": "On `invalid_arguments`: which fields failed, and why.",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              },
              "required": [
                "path",
                "message"
              ],
              "additionalProperties": false
            }
          },
          "path": {
            "description": "On an authoring refusal: where in your call's input it points, e.g. `steps.<key>.params.<field>`.",
            "type": "string"
          },
          "fix": {
            "description": "On an authoring refusal: the change to your call that would pass.",
            "type": "string"
          },
          "instruction": {
            "description": "On an authoring refusal: what to do next with it.",
            "type": "string"
          }
        },
        "required": [
          "ok",
          "code",
          "message"
        ],
        "description": "A call that was admitted and dispatched, and did not succeed.",
        "additionalProperties": false
      },
      "PagePreviewLinkError": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": false
          },
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "retry_after_seconds": {
                "type": "integer",
                "minimum": 1
              }
            },
            "required": [
              "code",
              "message"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "ok",
          "error"
        ],
        "description": "A Pages preview-link request that did not succeed.",
        "additionalProperties": false
      },
      "PageAssetError": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": false
          },
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "retry_after_seconds": {
                "type": "integer",
                "minimum": 1
              }
            },
            "required": [
              "code",
              "message"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "ok",
          "error"
        ],
        "description": "A Pages asset upload that did not succeed.",
        "additionalProperties": false
      },
      "PageIngestError": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": false
          },
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              }
            },
            "required": [
              "code",
              "message"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "ok",
          "error"
        ],
        "description": "A Pages import that did not succeed. ⚠️ Unlike a tool refusal, this envelope has NO `workspaces` array — on `workspace_ambiguous` and `workspace_unreachable` the slugs you may pass are appended to `error.message` instead.",
        "additionalProperties": false
      },
      "PagesDeployManifest": {
        "type": "object",
        "properties": {
          "entry": {
            "description": "The Worker module that answers `routes`, relative to the bundle root. Omit it for a static site.",
            "type": "string",
            "minLength": 1,
            "maxLength": 512
          },
          "assets": {
            "description": "The directory holding the site's static files, relative to the bundle root.",
            "type": "string",
            "minLength": 1,
            "maxLength": 512
          },
          "routes": {
            "description": "Which paths the Worker answers; everything else is served as a static file. A route whose `access` is `members` is gated by the platform before anything answers it, so a static site with no `entry` may declare members routes and nothing else.",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "pattern": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 512,
                  "description": "A site-root-relative path the Worker answers. `*` is allowed only as a trailing `/*`."
                },
                "access": {
                  "description": "Who may reach this route. `members` requires a member of this site's workspace, signed in to Goosy; the platform enforces it before your code runs. Defaults to `public`.",
                  "type": "string",
                  "enum": [
                    "public",
                    "members"
                  ]
                }
              },
              "required": [
                "pattern"
              ],
              "additionalProperties": false
            }
          },
          "bindings": {
            "description": "What this bundle asks to be wired to.",
            "type": "object",
            "properties": {
              "database": {
                "description": "The site's own database. Declaring it provisions one on the first build.",
                "type": "object",
                "properties": {
                  "migrations": {
                    "description": "Directory of `.sql` migrations for this site's own database, applied in filename order.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 512
                  },
                  "tables": {
                    "description": "The tables this site's code owns.",
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 63
                    }
                  },
                  "stagedMigrationsPrefix": {
                    "description": "PLATFORM-WRITTEN. Where the migrations above were actually staged, once the bundle was relocated into the reserved prefix. Never write this yourself — a manifest that carries it on upload is refused.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 64
                  }
                },
                "additionalProperties": false
              },
              "projectDatabase": {
                "description": "How this site reaches the PROJECT database shared by its project's sites. Defaults to `none`.",
                "type": "string",
                "enum": [
                  "none",
                  "read",
                  "readwrite"
                ]
              },
              "secrets": {
                "description": "Secret NAMES this Worker reads. Values are set on the site, never in this file.",
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64
                }
              },
              "submissions": {
                "description": "A table that platform form posts are also written to, so a static site keeps its own entries.",
                "type": "string",
                "minLength": 1,
                "maxLength": 63
              },
              "storage": {
                "description": "The site's own object store. Declaring it provisions one bucket on the first publish and binds it.",
                "type": "object",
                "properties": {
                  "name": {
                    "description": "The identifier your Worker reads the bucket through. Defaults to `BUCKET`.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 64
                  }
                },
                "additionalProperties": false
              },
              "images": {
                "description": "Attach the image-transform binding, so your Worker can resize and re-encode bytes it already holds. Defaults to `false`.",
                "type": "boolean"
              },
              "kv": {
                "description": "The site's own key-value store. Declaring it provisions one namespace on the first publish and binds it.",
                "type": "object",
                "properties": {
                  "name": {
                    "description": "The identifier your Worker reads the key-value store through. Defaults to `KV`.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 64
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false
          },
          "limits": {
            "description": "The caps this bundle asks for. The platform decides the ceilings and refuses anything over them.",
            "type": "object",
            "properties": {
              "cpuMs": {
                "description": "CPU milliseconds per invocation. Defaults to 10000; the platform ceiling is 30000.",
                "type": "integer",
                "exclusiveMinimum": 0
              },
              "subRequests": {
                "description": "Outbound sub-requests per invocation. Defaults to 20; the platform ceiling is 50.",
                "type": "integer",
                "exclusiveMinimum": 0
              }
            },
            "additionalProperties": false
          },
          "runtime": {
            "description": "What this bundle's Worker needs from the Workers runtime. Read from your bundle's own `wrangler.json` when it ships one; declare it here otherwise.",
            "type": "object",
            "properties": {
              "compatibilityFlags": {
                "description": "Workers compatibility flags your Worker needs to start — global_fetch_strictly_public, nodejs_compat. Anything else is refused by name. Set this only when your bundle ships no JSON Wrangler config for us to read it from.",
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64
                }
              },
              "compatibilityDate": {
                "description": "The Workers compatibility date your bundle was COMPILED against, as `YYYY-MM-DD`. It is ignored unless it is newer than the platform's own pin — it can only move the date forward, never back.",
                "type": "string",
                "minLength": 1,
                "maxLength": 10
              }
            },
            "additionalProperties": false
          },
          "forms": {
            "description": "The forms whose leads start an automation. A lead from a form named here raises its `event` beside `pages.lead.captured`; a form not named here raises only `pages.lead.captured`.",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64,
                  "description": "The form's name, as its lead carries it in the `form` field: lowercase letters, digits, `-` and `_`."
                },
                "event": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 71,
                  "description": "The automation event a lead from this form starts: `custom.` then a lowercase name of letters, digits and underscores, starting with a letter."
                }
              },
              "required": [
                "name",
                "event"
              ],
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false,
        "description": "`pages.deploy.json` — the one file a bundle uses to say what it is and what it needs. Put it at the bundle root."
      }
    }
  },
  "paths": {
    "/api/v1/tools/content.status": {
      "post": {
        "operationId": "call_content_status",
        "summary": "Call content.status",
        "description": "Read where this workspace's content stands — 'what's scheduled this week?', 'why did that post fail?' — every piece with its lifecycle status, its schedule, its elected platform versions, and the reason any of it failed. Call this before answering any question about what is drafted, ready, scheduled or live; never guess it. It reads only. Not for the week laid out by day — that is `schedule.read`.\n\nEvery 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.",
        "tags": [
          "content"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "status": {
                    "description": "Only pieces in this lifecycle state.",
                    "type": "string",
                    "enum": [
                      "draft",
                      "variants_in_progress",
                      "ready",
                      "approved",
                      "scheduled",
                      "publishing",
                      "published",
                      "verified",
                      "failed"
                    ]
                  },
                  "format": {
                    "description": "Only pieces of this format.",
                    "type": "string",
                    "enum": [
                      "posts",
                      "stories",
                      "shorts_clips",
                      "long_form",
                      "articles",
                      "podcast"
                    ]
                  },
                  "limit": {
                    "default": 25,
                    "description": "How many pieces to return, newest-updated first.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 100
                  },
                  "cursor": {
                    "description": "Where to continue: pass the `next_cursor` from the previous page, with the same filters. Omit it for the first page.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 512
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "counts": {
                          "type": "object",
                          "propertyNames": {
                            "type": "string"
                          },
                          "additionalProperties": {
                            "type": "number"
                          },
                          "description": "How many of the returned pieces sit in each status."
                        },
                        "total": {
                          "type": "number"
                        },
                        "truncated": {
                          "type": "boolean",
                          "description": "True when more pieces matched than were returned. Deprecated: page with `cursor` until `next_cursor` is absent."
                        },
                        "next_cursor": {
                          "description": "Present when there is another page: pass it back as `cursor` to read it. Absent on the last page.",
                          "type": "string"
                        },
                        "pieces": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "title": {
                                "type": "string"
                              },
                              "format": {
                                "type": "string",
                                "enum": [
                                  "posts",
                                  "stories",
                                  "shorts_clips",
                                  "long_form",
                                  "articles",
                                  "podcast"
                                ]
                              },
                              "status": {
                                "type": "string",
                                "enum": [
                                  "draft",
                                  "variants_in_progress",
                                  "ready",
                                  "approved",
                                  "scheduled",
                                  "publishing",
                                  "published",
                                  "verified",
                                  "failed"
                                ]
                              },
                              "scheduled_for": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "published_at": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "failure_reason": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "variants": {
                                "type": "array",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "platform": {
                                      "type": "string"
                                    },
                                    "status": {
                                      "type": "string"
                                    }
                                  },
                                  "required": [
                                    "platform",
                                    "status"
                                  ],
                                  "additionalProperties": false
                                }
                              }
                            },
                            "required": [
                              "id",
                              "title",
                              "format",
                              "status",
                              "scheduled_for",
                              "published_at",
                              "failure_reason",
                              "variants"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "counts",
                        "pieces",
                        "total",
                        "truncated",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/schedule.read": {
      "post": {
        "operationId": "call_schedule_read",
        "summary": "Call schedule.read",
        "description": "Read one week of this workspace's schedule grid — 'what's going out next week?', 'show me Thursday's slots' — the format rows the active cadence plans, every piece bucketed into its day column, and the zone those columns are in. It is the same grid /schedule draws, so the answer and the screen always agree, and it reads only. Not for each piece's lifecycle status and failure reasons — that is `content.status`.\n\nEvery 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.",
        "tags": [
          "schedule"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "week": {
                    "description": "Any date in the wanted week, as YYYY-MM-DD. Omit for the current week.",
                    "type": "string"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "week_start": {
                          "type": "string",
                          "description": "The Monday of the returned week."
                        },
                        "days": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          },
                          "description": "The week's seven day columns."
                        },
                        "display_time_zone": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "The zone every day column is bucketed in."
                        },
                        "has_cadence": {
                          "type": "boolean",
                          "description": "False when this workspace has no active cadence template."
                        },
                        "meta_line": {
                          "type": "string"
                        },
                        "rows": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "format": {
                                "type": "string",
                                "enum": [
                                  "posts",
                                  "stories",
                                  "shorts_clips",
                                  "long_form",
                                  "articles",
                                  "podcast"
                                ]
                              },
                              "label": {
                                "type": "string"
                              },
                              "quota_line": {
                                "type": "string"
                              },
                              "planned_count": {
                                "type": "number"
                              }
                            },
                            "required": [
                              "format",
                              "label",
                              "quota_line",
                              "planned_count"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "pieces": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "title": {
                                "type": "string"
                              },
                              "format": {
                                "type": "string",
                                "enum": [
                                  "posts",
                                  "stories",
                                  "shorts_clips",
                                  "long_form",
                                  "articles",
                                  "podcast"
                                ]
                              },
                              "status": {
                                "type": "string",
                                "enum": [
                                  "draft",
                                  "variants_in_progress",
                                  "ready",
                                  "approved",
                                  "scheduled",
                                  "publishing",
                                  "published",
                                  "verified",
                                  "failed"
                                ]
                              },
                              "day": {
                                "type": "string"
                              },
                              "scheduled_for": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "platforms": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              }
                            },
                            "required": [
                              "id",
                              "title",
                              "format",
                              "status",
                              "day",
                              "scheduled_for",
                              "platforms"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "days",
                        "display_time_zone",
                        "has_cadence",
                        "meta_line",
                        "pieces",
                        "rows",
                        "week_start",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/library.search": {
      "post": {
        "operationId": "call_library_search",
        "summary": "Call library.search",
        "description": "Search this workspace's library — 'do we have a photo of the storefront?', 'find last month's launch video' — every finished image, clip, video and document, with the pinned ones first. Call this before answering any question about what this brand already has; never guess whether an asset exists. It reads only. Not for reading one item you already have the id of — that is `library.get`.\n\nEvery 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.",
        "tags": [
          "library"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "description": "Match items whose name contains this text. Omit to browse the shelf.",
                    "type": "string"
                  },
                  "roll": {
                    "description": "Only this shelf. Omit to search all of them.",
                    "type": "string",
                    "enum": [
                      "images",
                      "clips",
                      "videos",
                      "documents"
                    ]
                  },
                  "pinned_only": {
                    "description": "Only items someone has pinned.",
                    "type": "boolean"
                  },
                  "limit": {
                    "default": 25,
                    "description": "How many items to return. Pinned items come first.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 50
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "total": {
                          "type": "number"
                        },
                        "truncated": {
                          "type": "boolean",
                          "description": "True when more matched than were returned, or the search window was reached. Narrow by roll rather than trusting a short answer."
                        },
                        "search_window": {
                          "type": "number",
                          "description": "How many items the text match ran over — the newest of this workspace's finished work, pinned items first. Only meaningful with `query`."
                        },
                        "items": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "kind": {
                                "type": "string",
                                "enum": [
                                  "image_generation",
                                  "storage_object",
                                  "video_unit",
                                  "document"
                                ],
                                "description": "What sort of object this is — pass it back to library.get."
                              },
                              "id": {
                                "type": "string",
                                "description": "The object's own id. With `kind`, this addresses it exactly."
                              },
                              "roll": {
                                "type": "string",
                                "enum": [
                                  "images",
                                  "clips",
                                  "videos",
                                  "documents"
                                ],
                                "description": "Which shelf of the library it sits on."
                              },
                              "title": {
                                "type": "string",
                                "description": "What it is called: the name someone typed when pinning it, else the object's own label."
                              },
                              "pinned": {
                                "type": "boolean",
                                "description": "Has someone pinned this to the shelf?"
                              },
                              "pinned_name": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "finalized_at": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ],
                                "description": "When it was promoted into the library."
                              },
                              "source_board_id": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ],
                                "description": "The board it was made on, when that board still exists."
                              },
                              "source_board_name": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "preview_image_generation_id": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ],
                                "description": "The image whose bytes preview it, when it has one."
                              },
                              "preview_has_bytes": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "kind",
                              "id",
                              "roll",
                              "title",
                              "pinned",
                              "pinned_name",
                              "finalized_at",
                              "source_board_id",
                              "source_board_name",
                              "preview_image_generation_id",
                              "preview_has_bytes"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "items",
                        "search_window",
                        "total",
                        "truncated",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/library.get": {
      "post": {
        "operationId": "call_library_get",
        "summary": "Call library.get",
        "description": "Read one library item by the `kind` and `id` library.search returned — 'open that video', 'where was this image made?'. Use it to confirm an item still exists and to see where it was made before you reference it; it reads only. Not for finding items by what they are — that is `library.search`.\n\nEvery 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.",
        "tags": [
          "library"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "kind": {
                    "type": "string",
                    "enum": [
                      "image_generation",
                      "storage_object",
                      "video_unit",
                      "document"
                    ],
                    "description": "The item's kind, exactly as library.search reported it."
                  },
                  "id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The item's id from library.search."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "kind",
                  "id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "kind": {
                          "type": "string",
                          "enum": [
                            "image_generation",
                            "storage_object",
                            "video_unit",
                            "document"
                          ],
                          "description": "What sort of object this is — pass it back to library.get."
                        },
                        "id": {
                          "type": "string",
                          "description": "The object's own id. With `kind`, this addresses it exactly."
                        },
                        "roll": {
                          "type": "string",
                          "enum": [
                            "images",
                            "clips",
                            "videos",
                            "documents"
                          ],
                          "description": "Which shelf of the library it sits on."
                        },
                        "title": {
                          "type": "string",
                          "description": "What it is called: the name someone typed when pinning it, else the object's own label."
                        },
                        "pinned": {
                          "type": "boolean",
                          "description": "Has someone pinned this to the shelf?"
                        },
                        "pinned_name": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "finalized_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "When it was promoted into the library."
                        },
                        "source_board_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "The board it was made on, when that board still exists."
                        },
                        "source_board_name": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "preview_image_generation_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "The image whose bytes preview it, when it has one."
                        },
                        "preview_has_bytes": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "finalized_at",
                        "id",
                        "kind",
                        "pinned",
                        "pinned_name",
                        "preview_has_bytes",
                        "preview_image_generation_id",
                        "roll",
                        "source_board_id",
                        "source_board_name",
                        "title",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/knowledge.search": {
      "post": {
        "operationId": "call_knowledge_search",
        "summary": "Call knowledge.search",
        "description": "Search this workspace's own brand corpus — 'what do we say about pricing?', 'how do we describe our service?' — everything ingested about how this brand talks, what it sells and what it has published. Call this before answering any question about what the brand says; never guess it. Results are this brand's material only. Not for the live web — that is `web.api_search`.\n\nEvery 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.",
        "tags": [
          "knowledge"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 500,
                    "description": "What to look for in the brand corpus, in plain words."
                  },
                  "limit": {
                    "default": 5,
                    "description": "How many chunks to return, closest match first.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 20
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "query"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "query": {
                          "type": "string",
                          "description": "The query as it was actually searched."
                        },
                        "hits": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "source": {
                                "type": "string",
                                "description": "What kind of thing the chunk came from — url, file, text, youtube, and so on."
                              },
                              "excerpt": {
                                "type": "string"
                              },
                              "relevance": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 1,
                                "description": "Higher is closer to the query."
                              },
                              "affinity": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ],
                                "description": "Which corpus slice it came from, when the row says."
                              }
                            },
                            "required": [
                              "source",
                              "excerpt",
                              "relevance",
                              "affinity"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "hits",
                        "query",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.status": {
      "post": {
        "operationId": "call_connections_status",
        "summary": "Call connections.status",
        "description": "Read this workspace's live connections — 'is Instagram connected?', 'what needs reconnecting?' — what is connected, what needs attention, what is available to connect, and what is not built yet. Call this before answering any question about connection state; never guess it. Not for connecting an account: that is an operator decision made on screen, and no verb here does it.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "connected": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string",
                                "description": "What the connection is called, in the operator's own words."
                              },
                              "state": {
                                "type": "string",
                                "description": "Where it stands — connected_live, token_expired, not_connected, and so on."
                              },
                              "account": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ],
                                "description": "Which account or grant it rides, when it names one."
                              },
                              "note": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ],
                                "description": "One short sentence, on states that need attention only."
                              }
                            },
                            "required": [
                              "name",
                              "state",
                              "account",
                              "note"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "needs_attention": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string",
                                "description": "What the connection is called, in the operator's own words."
                              },
                              "state": {
                                "type": "string",
                                "description": "Where it stands — connected_live, token_expired, not_connected, and so on."
                              },
                              "account": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ],
                                "description": "Which account or grant it rides, when it names one."
                              },
                              "note": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ],
                                "description": "One short sentence, on states that need attention only."
                              }
                            },
                            "required": [
                              "name",
                              "state",
                              "account",
                              "note"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "available": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string",
                                "description": "What the connection is called, in the operator's own words."
                              },
                              "state": {
                                "type": "string",
                                "description": "Where it stands — connected_live, token_expired, not_connected, and so on."
                              },
                              "account": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ],
                                "description": "Which account or grant it rides, when it names one."
                              },
                              "note": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ],
                                "description": "One short sentence, on states that need attention only."
                              }
                            },
                            "required": [
                              "name",
                              "state",
                              "account",
                              "note"
                            ],
                            "additionalProperties": false
                          },
                          "description": "Connectable today, not connected yet."
                        },
                        "coming_soon": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          },
                          "description": "Named so you can say 'not yet' rather than invent a way in."
                        },
                        "counts": {
                          "type": "object",
                          "properties": {
                            "connected": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "attention": {
                              "type": "integer",
                              "minimum": 0
                            }
                          },
                          "required": [
                            "connected",
                            "attention"
                          ],
                          "additionalProperties": false
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "available",
                        "coming_soon",
                        "connected",
                        "counts",
                        "needs_attention",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/credits.balance": {
      "post": {
        "operationId": "call_credits_balance",
        "summary": "Call credits.balance",
        "description": "Read how many credits this account has left — 'how many credits do we have?', 'are we running low on credits?'. Say the figure back exactly as given — never work one out or recall one. Not for topping up: a person does that on Settings → Billing, and no verb here can.",
        "tags": [
          "credits"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {},
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` whenever the call did not succeed, including when the tool itself returned a typed `ok: false` — this tool runs at account level, so there is no workspace boundary to distinguish. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "balance": {
                          "type": "number",
                          "description": "How many credits are left on the account that pays for this workspace."
                        }
                      },
                      "required": [
                        "ok",
                        "balance"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/content.create_request": {
      "post": {
        "operationId": "call_content_create_request",
        "summary": "Call content.create_request",
        "description": "Ask this workspace to make a new piece of content on a given day — 'add a post on Thursday', 'we need something going out next Monday'. It is the same request the operator makes by pressing the plus in a cell of the schedule grid: it lands in that week's block, on the cadence's own planned slot when one is free, with the platforms that cadence elects. Not for reading what is already planned — that is `schedule.read`.\n\nEvery 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.",
        "tags": [
          "content"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "format": {
                    "type": "string",
                    "enum": [
                      "posts",
                      "stories",
                      "shorts_clips",
                      "long_form",
                      "articles",
                      "podcast"
                    ],
                    "description": "What kind of piece to create a request for."
                  },
                  "day": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                    "description": "The day it is planned for, as YYYY-MM-DD. The workspace's own cadence decides the time of day."
                  },
                  "title": {
                    "description": "A working title. Omit to leave it untitled.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "format",
                  "day"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "piece_id": {
                          "type": "string"
                        },
                        "format": {
                          "type": "string",
                          "enum": [
                            "posts",
                            "stories",
                            "shorts_clips",
                            "long_form",
                            "articles",
                            "podcast"
                          ]
                        },
                        "scheduled_for": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "When it is planned to publish, ISO 8601 UTC."
                        },
                        "week_block_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "The publication week it grouped under, when the workspace has one open."
                        },
                        "filled_planned_slot": {
                          "type": "boolean",
                          "description": "True when it filled a slot the workspace's cadence already planned."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "filled_planned_slot",
                        "format",
                        "piece_id",
                        "scheduled_for",
                        "week_block_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/library.update": {
      "post": {
        "operationId": "call_library_update",
        "summary": "Call library.update",
        "description": "Rename one item in this workspace's library — 'rename that video to Spring launch', 'call this image Hero shot'. Renaming is the only thing it changes: it never edits, regenerates, moves or removes the work itself, and there is no verb here that can. Not for finding the item — that is `library.search`.\n\nEvery 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.",
        "tags": [
          "library"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "item_id": {
                    "type": "string",
                    "description": "Which library item to change — an id from library.search."
                  },
                  "name": {
                    "type": "string",
                    "maxLength": 120,
                    "description": "The new name. Send an empty string to clear it back to unnamed, which lets the item's own description show instead."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "item_id",
                  "name"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "id": {
                          "type": "string"
                        },
                        "name": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "The stored name, or null when it is unnamed."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "id",
                        "name",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/images.generate": {
      "post": {
        "operationId": "call_images_generate",
        "summary": "Call images.generate",
        "description": "Generate new images onto a board in this workspace — 'make three pictures of our product on a beach', 'generate a hero image for the launch'. It spends credits, so it answers in two calls on every key: without confirmation_id it checks the board, says what would be made and returns a confirmation_id, and makes and charges nothing; the same call again with that confirmation_id, on a member's own API key, starts the run and answers its run_id. Not for changing an image that already exists — that is `images.iterate`.\n\nEvery 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.",
        "tags": [
          "images"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board": {
                    "type": "string",
                    "description": "Which board the images land on — a board id in this workspace."
                  },
                  "brief": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000,
                    "description": "What to generate, in plain words."
                  },
                  "count": {
                    "default": 1,
                    "description": "How many images to make. Each one costs credits.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 10
                  },
                  "shape": {
                    "description": "The aspect ratio. Omit for the workspace default.",
                    "type": "string",
                    "enum": [
                      "1:1",
                      "3:4",
                      "4:3",
                      "9:16",
                      "16:9"
                    ]
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "board",
                  "brief"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ],
                              "description": "Present only while confirmation is required. Send it back on the second call."
                            }
                          ]
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "anyOf": [
                            {
                              "type": "string",
                              "description": "What will happen, in one sentence, for a person to approve before confirming."
                            },
                            {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ],
                              "description": "Present only while confirmation is required — what will be made, in one sentence, for a person to approve."
                            }
                          ]
                        },
                        "status": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "enum": [
                                "dispatched",
                                "accepted"
                              ],
                              "description": "dispatched — the run is under way. accepted — the run is under way but its details could not be read just now: count and aspect_ratio are null; follow it by run_id. (The first call answers confirmation_required: nothing ran and nothing was charged.)"
                            }
                          ]
                        },
                        "count": {
                          "anyOf": [
                            {
                              "type": "integer",
                              "description": "How many images this run covers."
                            },
                            {
                              "anyOf": [
                                {
                                  "type": "integer"
                                },
                                {
                                  "type": "null"
                                }
                              ],
                              "description": "How many images this run covers; null when accepted."
                            }
                          ]
                        },
                        "aspect_ratio": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          ]
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "run_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Present only once dispatched — the run to follow."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "aspect_ratio",
                        "board_id",
                        "confirmation_id",
                        "count",
                        "request_summary",
                        "status",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/images.iterate": {
      "post": {
        "operationId": "call_images_iterate",
        "summary": "Call images.iterate",
        "description": "Edit an image already on a board in this workspace — 'make the background darker on that image', 'swap the shirt colour to blue'. It spends credits, so it answers in two calls on every key: without confirmation_id it checks the board, says what would be changed and returns a confirmation_id, and changes and charges nothing; the same call again with that confirmation_id, on a member's own API key, starts the edit and answers its run_id. Not for a brand-new image — that is `images.generate`.\n\nEvery 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.",
        "tags": [
          "images"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board": {
                    "type": "string",
                    "description": "Which board the images land on — a board id in this workspace."
                  },
                  "brief": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000,
                    "description": "What to generate, in plain words."
                  },
                  "count": {
                    "default": 1,
                    "description": "How many images to make. Each one costs credits.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 10
                  },
                  "shape": {
                    "description": "The aspect ratio. Omit for the workspace default.",
                    "type": "string",
                    "enum": [
                      "1:1",
                      "3:4",
                      "4:3",
                      "9:16",
                      "16:9"
                    ]
                  },
                  "parent_generation_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The existing image on this board to edit."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "board",
                  "brief",
                  "parent_generation_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ],
                              "description": "Present only while confirmation is required. Send it back on the second call."
                            }
                          ]
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "anyOf": [
                            {
                              "type": "string",
                              "description": "What will happen, in one sentence, for a person to approve before confirming."
                            },
                            {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ],
                              "description": "Present only while confirmation is required — what will be made, in one sentence, for a person to approve."
                            }
                          ]
                        },
                        "status": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "enum": [
                                "dispatched",
                                "accepted"
                              ],
                              "description": "dispatched — the run is under way. accepted — the run is under way but its details could not be read just now: count and aspect_ratio are null; follow it by run_id. (The first call answers confirmation_required: nothing ran and nothing was charged.)"
                            }
                          ]
                        },
                        "count": {
                          "anyOf": [
                            {
                              "type": "integer",
                              "description": "How many images this run covers."
                            },
                            {
                              "anyOf": [
                                {
                                  "type": "integer"
                                },
                                {
                                  "type": "null"
                                }
                              ],
                              "description": "How many images this run covers; null when accepted."
                            }
                          ]
                        },
                        "aspect_ratio": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          ]
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "run_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Present only once dispatched — the run to follow."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "aspect_ratio",
                        "board_id",
                        "confirmation_id",
                        "count",
                        "request_summary",
                        "status",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/pages.ai.generate_text": {
      "post": {
        "operationId": "call_pages_ai_generate_text",
        "summary": "Call pages.ai.generate_text",
        "description": "Generate bounded managed text for the credential-bound Pages workload — 'write a headline for this section', 'draft the FAQ answers'. Not for searching the web — that is `web.api_search`.\n\nEvery 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.",
        "tags": [
          "pages"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "instruction": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000,
                    "description": "What the generated text should accomplish."
                  },
                  "input": {
                    "type": "object",
                    "properties": {
                      "text": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 100000
                      },
                      "citations": {
                        "maxItems": 32,
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "title": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 500
                            },
                            "url": {
                              "type": "string",
                              "maxLength": 2048,
                              "format": "uri"
                            },
                            "excerpt": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 4000
                            }
                          },
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": [
                      "text"
                    ],
                    "additionalProperties": false,
                    "description": "The source text and optional citations the generated text must use."
                  },
                  "confirmation_id": {
                    "description": "Confirms the stored exact call. When supplied, the stored request replaces all other body fields.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "idempotency_key": {
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 256
                  },
                  "requestedOutputTokens": {
                    "description": "Required for an initial text request and bounded by the admitted policy.",
                    "type": "integer",
                    "exclusiveMinimum": 0
                  },
                  "tier": {
                    "description": "Optional configured writing tier. Omit to use the grant default.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false,
                "required": []
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "completed",
                            "reconciliation_required",
                            "terminal_replay"
                          ]
                        },
                        "confirmation_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "status": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "succeeded",
                                "failed",
                                "uncertain",
                                "running"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "response": {
                          "anyOf": [
                            {},
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "error_code": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/web.search": {
      "post": {
        "operationId": "call_web_search",
        "summary": "Call web.search",
        "description": "Run a bounded managed web search for the credential-bound workload — 'search for local coffee roasters', 'find recent news on this topic'. Not for reading one page you already have the address of — that is `web.api_read`.\n\nEvery 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.",
        "tags": [
          "web"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 500,
                    "description": "The web search query."
                  },
                  "mode": {
                    "default": "answer",
                    "description": "Use answer for synthesis, semantic for relevance, or serp for ranked web results.",
                    "type": "string",
                    "enum": [
                      "answer",
                      "semantic",
                      "serp"
                    ]
                  },
                  "maxResults": {
                    "default": 5,
                    "description": "The maximum number of search results to return.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 10
                  },
                  "freshnessDays": {
                    "description": "Optional maximum age in days for search results when supported.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 365
                  },
                  "includeDomains": {
                    "description": "Optional domains to include in the search.",
                    "maxItems": 10,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 253
                    }
                  },
                  "excludeDomains": {
                    "description": "Optional domains to exclude from the search.",
                    "maxItems": 10,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 253
                    }
                  },
                  "confirmation_id": {
                    "description": "Confirms the stored exact call. When supplied, the stored request replaces all other body fields.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "idempotency_key": {
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 256
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false,
                "required": []
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "completed",
                            "reconciliation_required",
                            "terminal_replay"
                          ]
                        },
                        "confirmation_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "status": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "succeeded",
                                "failed",
                                "uncertain",
                                "running"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "response": {
                          "anyOf": [
                            {},
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "error_code": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/web.read": {
      "post": {
        "operationId": "call_web_read",
        "summary": "Call web.read",
        "description": "Read one web page for the credential-bound workload, within its managed bounds — 'read this link', 'what does their pricing page say?'. Not for finding pages you do not have yet — that is `web.api_search`.\n\nEvery 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.",
        "tags": [
          "web"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2048,
                    "description": "The public HTTP or HTTPS page to read."
                  },
                  "confirmation_id": {
                    "description": "Confirms the stored exact call. When supplied, the stored request replaces all other body fields.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "idempotency_key": {
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 256
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false,
                "required": []
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "completed",
                            "reconciliation_required",
                            "terminal_replay"
                          ]
                        },
                        "confirmation_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "status": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "succeeded",
                                "failed",
                                "uncertain",
                                "running"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "response": {
                          "anyOf": [
                            {},
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "error_code": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/web.image_search": {
      "post": {
        "operationId": "call_web_image_search",
        "summary": "Call web.image_search",
        "description": "Find image references for the credential-bound workload, within its managed bounds — 'find photos of mountain cabins', 'look for a picture of a latte'. It returns references only. Not for bringing one onto the site board — that is `images.api_acquire_remote`.\n\nEvery 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.",
        "tags": [
          "web"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 300,
                    "description": "The image search query."
                  },
                  "maxResults": {
                    "default": 5,
                    "description": "The maximum number of image results to return.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 10
                  },
                  "imageType": {
                    "description": "Optional image content type to prefer.",
                    "type": "string",
                    "enum": [
                      "face",
                      "photo"
                    ]
                  },
                  "size": {
                    "description": "Optional image size to prefer.",
                    "type": "string",
                    "enum": [
                      "medium",
                      "large"
                    ]
                  },
                  "aspect": {
                    "description": "Optional image aspect ratio to prefer.",
                    "type": "string",
                    "enum": [
                      "square",
                      "tall",
                      "wide"
                    ]
                  },
                  "usageRights": {
                    "description": "Optional usage-rights filter for returned images.",
                    "type": "string",
                    "enum": [
                      "creative_commons_licenses",
                      "commercial_or_other_licenses"
                    ]
                  },
                  "confirmation_id": {
                    "description": "Confirms the stored exact call. When supplied, the stored request replaces all other body fields.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "idempotency_key": {
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 256
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false,
                "required": []
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "completed",
                            "reconciliation_required",
                            "terminal_replay"
                          ]
                        },
                        "confirmation_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "status": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "succeeded",
                                "failed",
                                "uncertain",
                                "running"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "response": {
                          "anyOf": [
                            {},
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "error_code": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/images.acquire_remote": {
      "post": {
        "operationId": "call_images_acquire_remote",
        "summary": "Call images.acquire_remote",
        "description": "Bring one managed image-search result onto the credential-bound site board — 'use that photo on the site', 'save the second result to the board'. Not for finding images — that is `web.api_image_search`.\n\nEvery 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.",
        "tags": [
          "images"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "searchRequestId": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The completed managed image-search request that produced the result."
                  },
                  "position": {
                    "type": "integer",
                    "minimum": 1,
                    "description": "The one-based position of the search result to acquire into the site board."
                  },
                  "confirmation_id": {
                    "description": "Confirms the stored exact call. When supplied, the stored request replaces all other body fields.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "idempotency_key": {
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 256
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false,
                "required": []
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "completed",
                            "reconciliation_required",
                            "terminal_replay"
                          ]
                        },
                        "confirmation_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "status": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "succeeded",
                                "failed",
                                "uncertain",
                                "running"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "response": {
                          "anyOf": [
                            {},
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "error_code": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/board.tree": {
      "post": {
        "operationId": "call_board_tree",
        "summary": "Call board.tree",
        "description": "Read this workspace's projects and boards as a tree — 'what projects do we have?', 'where does the client site live?'. It reads through the bearer-key API principal, changes nothing, and supplies the project ids `work.file` and `work.shortcut` take. Not for creating a project — that is `projects.create`.\n\nEvery 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.",
        "tags": [
          "board"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "kind": {
                    "description": "Narrow it to one sort of thing — 'site' for the operator's sites, 'images' for image boards, 'automation' for automations. Leave it out to see everything. Folders always show if they hold a match.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 40
                  },
                  "root_board_id": {
                    "description": "Start inside one folder, as a UUID from something you were shown. Leave it out for the whole workspace.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "roots": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "board_id": {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                              },
                              "name": {
                                "type": "string"
                              },
                              "kind": {
                                "type": "string"
                              },
                              "parent_board_id": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "format": "uuid",
                                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "updated_at": {
                                "type": "string"
                              },
                              "referenced": {
                                "type": "boolean"
                              },
                              "children": {
                                "type": "array",
                                "items": {}
                              }
                            },
                            "required": [
                              "board_id",
                              "name",
                              "kind",
                              "parent_board_id",
                              "updated_at",
                              "referenced",
                              "children"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "truncated": {
                          "type": "boolean"
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "roots",
                        "truncated",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/board.rename": {
      "post": {
        "operationId": "call_board_rename",
        "summary": "Call board.rename",
        "description": "Rename a board or project, a Dashboard desk (tab) included — 'call this project Spring Launch', 'change the name of the ads board to Q3 Ads', 'Home should be called Dashboard'.  Gives any board or project in this workspace the name the member chose, Home and Splash Pad included. Take board_id from the board the member is on or `board.tree`. Only the name changes: nothing inside it moves or is deleted, and it can be renamed again. A name the member gives is kept; Goosy's automatic naming never replaces it. Not for moving it into another project — that is `work.file`.\n\nEvery 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.",
        "tags": [
          "board"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "The new name, in the member's own words."
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "board_id",
                  "name"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "board_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "name": {
                          "type": "string"
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "replayed": {
                          "type": "boolean",
                          "description": "True when this is the first result of an earlier call with the same idempotency_key, returned without renaming anything again."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "board_id",
                        "name",
                        "replayed",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/board.reorder": {
      "post": {
        "operationId": "call_board_reorder",
        "summary": "Call board.reorder",
        "description": "Move a project to a new place among the projects beside it — 'put Analytics before Today', 'make the client tab the last one', 'move Spring launch to the top'. It changes the order the Dashboard's tabs, or a project's sub-projects, read in; nothing moves into or out of anything. Say exactly one of: the sibling it goes before, the one it goes after, or first or last. A project at the top level of the workspace is ordered by activity and cannot be placed by hand. Not for putting it inside a different project — that is `work.file`.\n\nEvery 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.",
        "tags": [
          "board"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "before_board_id": {
                    "description": "Put it just before this sibling, by its id.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "after_board_id": {
                    "description": "Put it just after this sibling, by its id.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "place": {
                    "description": "Put it first or last among its siblings.",
                    "type": "string",
                    "enum": [
                      "first",
                      "last"
                    ]
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "board_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "board_id",
                        "name",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/board.trash": {
      "post": {
        "operationId": "call_board_trash",
        "summary": "Call board.trash",
        "description": "Send a project or board to the Trash — 'delete the Spring launch project', 'get rid of that tab', 'remove the Analytics desk' (a desk by its id from `widget.list`). Everything inside it goes with it, and all of it can be restored for 30 days, after which it is deleted for good. Home and Splash Pad cannot be trashed. Calling it raises the approval card when no member asked for it. Not for taking one widget off a desk — that is `item.trash`; not for bringing one back — that is `board.restore`. 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.\n\nEvery 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.",
        "tags": [
          "board"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The project, board or Dashboard desk, by its id from `board.tree` or `widget.list`."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "board_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/board.restore": {
      "post": {
        "operationId": "call_board_restore",
        "summary": "Call board.restore",
        "description": "Bring a project or board back out of the Trash, with everything that was inside it — 'undo deleting that tab', 'restore the Spring launch project'. It returns to where it was. It works for 30 days after the trash; a board already deleted for good cannot come back. Not for bringing back a trashed widget — that is `item.restore`.\n\nEvery 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.",
        "tags": [
          "board"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "board_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "board_id",
                        "name",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/item.rename": {
      "post": {
        "operationId": "call_item_rename",
        "summary": "Call item.rename",
        "description": "Rename an image, an uploaded file, a data table, an email, a whole site or app, an automation, a video or short, or a widget on a desk or project — 'name the sunset picture Cover art', 'rename the uploaded price sheet to Pricing 2026', 'the signups table should be called Webinar leads', 'call the first welcome email Your table is ready', 'call this site Harbor Dental Care', 'change the name of the Monday report automation to Weekly Digest', 'retitle the spring promo video Spring Is Here', 'call the leads number Daily leads'. Gives the item the name the member chose, the one its tile, its list and every project it sits in show; an email's name is its subject line, so renaming an email changes the subject its readers see, and an email that is set to send is refused until the member sends it back to draft. Only the name changes: what the item holds, an email's body, a site's address, pages and live site, an automation's steps and whether it is on, a video's script, scenes and renders, and what a widget shows stay as they are; nothing is rebuilt, sent or published, and it can be renamed again. 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`, never its board_id, a video's video_unit_id, a widget's id from `widget.list`; otherwise send `current_name`, the member's words for what it is called now (an image with no name yet goes by the words of its prompt, an email by its subject, a video or a widget by its title; a site the member has open needs neither), and call it straight away — when several items match, the answer lists them so you can ask which. Not for a project or board, a course or series included — that is `board.rename` — nor one page inside a site, which is `page.set_page_label`, nor a library item named by a `library.search` id, which is `library.update`, nor what a widget shows, which is `widget.update`.\n\nEvery 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.",
        "tags": [
          "item"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "item_kind": {
                    "type": "string",
                    "enum": [
                      "image",
                      "file",
                      "table",
                      "email",
                      "site",
                      "automation",
                      "video",
                      "widget"
                    ],
                    "description": "What the item is: an image, an uploaded file, a data table, an email, 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": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "current_name": {
                    "description": "The member's words for what the item is called now, when there is no item_id.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "The new name, in the member's own words."
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "item_kind",
                  "name"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "item_kind": {
                          "type": "string",
                          "enum": [
                            "image",
                            "file",
                            "table",
                            "email",
                            "site",
                            "automation",
                            "video",
                            "widget"
                          ]
                        },
                        "item_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "name": {
                          "type": "string"
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "replayed": {
                          "type": "boolean",
                          "description": "True when this is the first result of an earlier call with the same idempotency_key, returned without renaming anything again."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "item_id",
                        "item_kind",
                        "name",
                        "replayed",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/item.trash": {
      "post": {
        "operationId": "call_item_trash",
        "summary": "Call item.trash",
        "description": "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.\n\nEvery 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.",
        "tags": [
          "item"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "item_kind": {
                    "type": "string",
                    "enum": [
                      "image",
                      "document",
                      "email",
                      "post",
                      "table",
                      "site",
                      "automation",
                      "video",
                      "widget"
                    ],
                    "description": "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": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "name": {
                    "description": "The member's words for the item's name, when there is no item_id.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "from_project_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "from_place": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "item_kind"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "item_kind": {
                          "type": "string",
                          "enum": [
                            "image",
                            "document",
                            "email",
                            "post",
                            "table",
                            "site",
                            "automation",
                            "video",
                            "widget"
                          ]
                        },
                        "item_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "name": {
                          "type": "string"
                        },
                        "trashed": {
                          "type": "boolean",
                          "description": "True when it went to the Trash; false when a widget only left the one place from_project_id named."
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/projects.create": {
      "post": {
        "operationId": "call_projects_create",
        "summary": "Call projects.create",
        "description": "Make a new project where the member is — 'start a project for the Harbor Dental rebrand', 'I need a new project called Fall menu', 'set up a sub-project here for the photo shoot'. A project is a canvas that holds the member's work and other projects. Made while the member is on a project, it goes inside that project; anywhere else it goes in Splash Pad, unless the member names the project it belongs in (parent_project_id from `board.tree`). It needs a name, so ask what to call it if they have not said. It starts empty: nothing is moved, published or spent. Not for moving something that already exists into a project (`work.file`), or for choosing where the member's new work starts from now on (`work.here`).\n\nEvery 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.",
        "tags": [
          "projects"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "description": "What to call the project, in the member's own words."
                  },
                  "parent_project_id": {
                    "description": "The project to make it inside, when the member named one. Left out, it is made inside the project the member is on, or in Splash Pad.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "name"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "project_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "name": {
                          "type": "string"
                        },
                        "parent_project_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "replayed": {
                          "type": "boolean",
                          "description": "True when this is the first result of an earlier call with the same idempotency_key, returned without changing anything again."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "name",
                        "parent_project_id",
                        "project_id",
                        "replayed",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/items.place": {
      "post": {
        "operationId": "call_items_place",
        "summary": "Call items.place",
        "description": "Bring an existing item — a photo, video, document, file, table, email, post, site, automation — onto the canvas the member is on now, as its home; a project the member names is `work.file` — 'put the leads table on this canvas', 'bring the logo file into this project', 'add the welcome email here'. Any item: a site, an automation, a video or short, a post, an image or photo, a document, an uploaded file, a data table, an email or a widget. This verb finds the item itself, so call it on the ask: put the member's words for the thing in item_name, a generic name too ('the new doc', 'that photo from Friday'), for any item but a widget. Among several matches it takes the one in the project the member is on, then the exact name; otherwise it moves nothing and answers with the matches by name and place, so you can ask which. The item then lives in the project the member is on (where their new work starts when they are on none); if it lived in another project it leaves that one, because an item lives in one place. Nothing is copied or deleted, and the member can undo it. Send item_id instead only when this conversation already showed you the item's id. Not for putting it in a project the member names (`work.file`), or for showing the item here while it stays where it lives (`work.shortcut`).\n\nEvery 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.",
        "tags": [
          "items"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "item_kind": {
                    "type": "string",
                    "enum": [
                      "site",
                      "automation",
                      "video",
                      "post",
                      "image",
                      "document",
                      "file",
                      "table",
                      "email",
                      "widget"
                    ],
                    "description": "What it is: a site, an automation, a video (or short), a post, an image (a photo or picture), a document, an uploaded file, a data table, an email or a widget."
                  },
                  "item_id": {
                    "description": "Its id, only when a verb or the page already showed it to you (a project's from `board.tree`, a widget's from `widget.list`). Otherwise send item_name: never call a list just to find an id.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "item_name": {
                    "description": "The member's words for its name, title or subject ('the latte video', 'price list', 'the Monday report automation'), a generic name included. It works for every kind but a project and a widget; the tool finds the item itself, with no read first, and when several things match the answer lists them by name and place so you can ask which.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "item_kind"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "item_kind": {
                          "type": "string",
                          "enum": [
                            "site",
                            "automation",
                            "video",
                            "post",
                            "image",
                            "document",
                            "file",
                            "table",
                            "email",
                            "widget"
                          ]
                        },
                        "item_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "name": {
                          "type": "string"
                        },
                        "project_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "from_project_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "trail": {
                          "type": "string"
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "replayed": {
                          "type": "boolean",
                          "description": "True when this is the first result of an earlier call with the same idempotency_key, returned without changing anything again."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "from_project_id",
                        "item_id",
                        "item_kind",
                        "name",
                        "project_id",
                        "replayed",
                        "trail",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/work.file": {
      "post": {
        "operationId": "call_work_file",
        "summary": "Call work.file",
        "description": "File or move any item — a document, photo, video, file, table, email, post, site, automation — or a whole project into a project the member names — 'move the onboarding video to the Clients project', 'put the Holiday gift boxes project under Wholesale cafes', 'the menu photos belong in Spring launch'. Any item (a site, an automation, a video or short, a post, an image or photo, a document, an uploaded file, a data table, an email, a widget) or a project, which takes everything inside it along. This verb finds the item itself, so call it on the ask: put the member's words for the thing in item_name, a generic name too ('the new doc', 'that photo from Friday'), for any item but a widget. Among several matches it takes the one in the project the member is on, then the exact name; otherwise it moves nothing and answers with the matches by name and place, so you can ask which. Read `board.tree` for to_project_id, the id of the project the member names; the tree lists projects, not the items inside them, so look for the item through this verb rather than in the tree. The project the member is on (the page's board_id) is where the item comes from, so it is never to_project_id here; putting a thing on that project is `items.place`. It leaves where it was and lives only in the new project; its shortcuts follow it, nothing is copied or deleted, and the member can undo it. A null to_project_id takes a project out to the top level of Projects; name a project being moved with item_kind project and its id from `board.tree`. Not for putting something on the project the member is on right now (`items.place`), or for showing it in a second project while it stays where it lives (`work.shortcut`).\n\nEvery 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.",
        "tags": [
          "work"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "item_kind": {
                    "description": "What it is: a site, an automation, a video (or short), a post, an image (a photo or picture), a document, an uploaded file, a data table, an email, a widget, or a project.",
                    "type": "string",
                    "enum": [
                      "site",
                      "automation",
                      "video",
                      "post",
                      "image",
                      "document",
                      "file",
                      "table",
                      "email",
                      "widget",
                      "project"
                    ]
                  },
                  "item_id": {
                    "description": "Its id, only when a verb or the page already showed it to you (a project's from `board.tree`, a widget's from `widget.list`). Otherwise send item_name: never call a list just to find an id.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "item_name": {
                    "description": "The member's words for its name, title or subject ('the latte video', 'price list', 'the Monday report automation'), a generic name included. It works for every kind but a project and a widget; the tool finds the item itself, with no read first, and when several things match the answer lists them by name and place so you can ask which.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "to_project_id": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "The project the member names as where it goes, by its id from `board.tree`. null only to take a project out to the top level of Projects."
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "to_project_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "item_kind": {
                          "type": "string",
                          "enum": [
                            "site",
                            "automation",
                            "video",
                            "post",
                            "image",
                            "document",
                            "file",
                            "table",
                            "email",
                            "widget",
                            "project"
                          ]
                        },
                        "item_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "name": {
                          "type": "string"
                        },
                        "from_project_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "to_project_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "trail": {
                          "type": "string"
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "replayed": {
                          "type": "boolean",
                          "description": "True when this is the first result of an earlier call with the same idempotency_key, returned without changing anything again."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "from_project_id",
                        "item_id",
                        "item_kind",
                        "name",
                        "replayed",
                        "to_project_id",
                        "trail",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/work.shortcut": {
      "post": {
        "operationId": "call_work_shortcut",
        "summary": "Call work.shortcut",
        "description": "Make a shortcut to any item — a document, photo, video, table, automation — or a project in another project, so it shows there too while it stays where it lives — 'show the brand video in the Launch project as well', 'link the pricing table into Wholesale cafes too', 'I want the onboarding automation reachable from Clients'. A shortcut opens the original: a change to the original shows everywhere, and nothing is copied or moved. This verb finds the item itself, so call it on the ask: put the member's words for the thing in item_name, a generic name too ('the new doc', 'that photo from Friday'), for any item but a widget. Among several matches it takes the one in the project the member is on, then the exact name; otherwise it moves nothing and answers with the matches by name and place, so you can ask which. Read `board.tree` for to_project_id, the id of the project the member names; the tree lists projects, not the items inside them, so look for the item through this verb rather than in the tree. Any item or a project can have one, and the member can remove it or undo it. Name a project with item_kind project and its id from `board.tree`. Not for moving the thing itself into that project (`work.file`).\n\nEvery 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.",
        "tags": [
          "work"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "item_kind": {
                    "description": "What it is: a site, an automation, a video (or short), a post, an image (a photo or picture), a document, an uploaded file, a data table, an email, a widget, or a project.",
                    "type": "string",
                    "enum": [
                      "site",
                      "automation",
                      "video",
                      "post",
                      "image",
                      "document",
                      "file",
                      "table",
                      "email",
                      "widget",
                      "project"
                    ]
                  },
                  "item_id": {
                    "description": "Its id, only when a verb or the page already showed it to you (a project's from `board.tree`, a widget's from `widget.list`). Otherwise send item_name: never call a list just to find an id.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "item_name": {
                    "description": "The member's words for its name, title or subject ('the latte video', 'price list', 'the Monday report automation'), a generic name included. It works for every kind but a project and a widget; the tool finds the item itself, with no read first, and when several things match the answer lists them by name and place so you can ask which.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "to_project_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The project the member names for the shortcut to appear in, by its id from `board.tree`."
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "to_project_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "item_kind": {
                          "type": "string",
                          "enum": [
                            "site",
                            "automation",
                            "video",
                            "post",
                            "image",
                            "document",
                            "file",
                            "table",
                            "email",
                            "widget",
                            "project"
                          ]
                        },
                        "item_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "name": {
                          "type": "string"
                        },
                        "home_project_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "to_project_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "shortcut_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "trail": {
                          "type": "string"
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "replayed": {
                          "type": "boolean",
                          "description": "True when this is the first result of an earlier call with the same idempotency_key, returned without changing anything again."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "home_project_id",
                        "item_id",
                        "item_kind",
                        "name",
                        "replayed",
                        "shortcut_id",
                        "to_project_id",
                        "trail",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/item.restore": {
      "post": {
        "operationId": "call_item_restore",
        "summary": "Call item.restore",
        "description": "Bring an image, a document, an email, a post, a data table, a video or short, or a widget back out of the Trash — 'bring back the lighthouse photo I trashed', 'restore the onboarding checklist doc', 'undo binning the renewal reminder email', 'I need the vendor contacts table back', 'take the open mic post out of the Trash', 'get the deleted harbor tour video back', 'put the bookings chart back'. The item returns to every project and list it left, under its name and with everything it held; nothing is charged, sent or published. A post comes back unscheduled: its place on the schedule was freed when it was trashed, so the member schedules it again. A widget comes back onto every desk and project it showed on. Call it straight away on the ask. Send `item_id` when a verb or the Trash page showed you the item's id (a widget's from `widget.list` with in_trash); otherwise send `name`, the member's words for its name, title or subject — when several trashed items match, the answer lists them so you can ask which. Not for a project — that is `board.restore` — nor a site or an automation, which comes back from the Trash page with its board.\n\nEvery 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.",
        "tags": [
          "item"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "item_kind": {
                    "type": "string",
                    "enum": [
                      "image",
                      "document",
                      "email",
                      "post",
                      "table",
                      "video",
                      "widget"
                    ],
                    "description": "What the item is: an image, a document, an email, a post, a data table, a video (a short is a video too), or a widget."
                  },
                  "item_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "name": {
                    "description": "The member's words for the trashed item's name, when there is no item_id.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "item_kind"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "item_kind": {
                          "type": "string",
                          "enum": [
                            "image",
                            "document",
                            "email",
                            "post",
                            "table",
                            "video",
                            "widget"
                          ]
                        },
                        "item_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "name": {
                          "type": "string"
                        },
                        "restored": {
                          "type": "boolean",
                          "const": true
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "replayed": {
                          "type": "boolean",
                          "description": "True when this is the first result of an earlier call with the same idempotency_key, returned without restoring anything again."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "item_id",
                        "item_kind",
                        "name",
                        "replayed",
                        "restored",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/data.create_table": {
      "post": {
        "operationId": "call_data_create_table",
        "summary": "Call data.create_table",
        "description": "Create a typed Data table in this workspace — 'make a table to track sponsors', 'set up a list of our venues'. It lands where the key's new work starts (the workspace's Splash Pad unless a Work here project is set); file it into a project with `work.file`. Not for adding rows — that is `data.api_append`.\n\nEvery 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.",
        "tags": [
          "data"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "maxLength": 120,
                    "description": "What this table is called, in the operator's own words."
                  },
                  "columns": {
                    "maxItems": 100,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "key": {
                          "type": "string",
                          "description": "The column's identifier: lower snake case, starting with a letter, at most 64 characters (for example `first_name`). It is what row values are keyed by."
                        },
                        "label": {
                          "type": "string",
                          "maxLength": 120,
                          "description": "What a person reads at the head of the column."
                        },
                        "type": {
                          "type": "string",
                          "enum": [
                            "text",
                            "number",
                            "boolean",
                            "date",
                            "email",
                            "phone",
                            "url",
                            "json",
                            "action",
                            "file"
                          ],
                          "description": "The cell type. Values are coerced to it at every write and REFUSED when they do not fit, so pick the narrowest one that is honestly true."
                        },
                        "required": {
                          "description": "Leave it out unless a row is meaningless without this column.",
                          "type": "boolean"
                        },
                        "source": {
                          "description": "WHO fills this column — a connector key or an automation, in free text. Never a vendor name you assumed; only one the operator or a tool gave you.",
                          "type": "string",
                          "maxLength": 80
                        },
                        "event": {
                          "description": "For an `action` column only: the `custom.<name>` event its row button sends.",
                          "type": "string"
                        }
                      },
                      "required": [
                        "key",
                        "label",
                        "type"
                      ],
                      "description": "One typed column of a data table.",
                      "additionalProperties": false
                    },
                    "description": "The typed header. At most 100 columns. Every column key must be unique in the table."
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "columns",
                  "name"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "table_id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "board_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "board_item_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "column_count": {
                          "type": "number"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "board_id",
                        "board_item_id",
                        "column_count",
                        "name",
                        "table_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/data.describe": {
      "post": {
        "operationId": "call_data_describe",
        "summary": "Call data.describe",
        "description": "Describe this workspace's typed Data tables — 'what tables do we have?', 'what columns does the sponsors table have?' — optionally narrowed to one table or one board. It reads only. Not for reading the rows themselves — that is `data.api_query`.\n\nEvery 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.",
        "tags": [
          "data"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "table_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The table to describe."
                  },
                  "board_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "Describe every data table on this board instead of one table by id."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "tables": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "table_id": {
                                "type": "string"
                              },
                              "name": {
                                "type": "string"
                              },
                              "board_id": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "row_count": {
                                "type": "number"
                              },
                              "row_limit": {
                                "type": "number"
                              },
                              "columns": {
                                "type": "array",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "key": {
                                      "type": "string"
                                    },
                                    "label": {
                                      "type": "string"
                                    },
                                    "type": {
                                      "type": "string"
                                    },
                                    "required": {
                                      "type": "boolean"
                                    },
                                    "source": {
                                      "anyOf": [
                                        {
                                          "type": "string"
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    }
                                  },
                                  "required": [
                                    "key",
                                    "label",
                                    "type",
                                    "required",
                                    "source"
                                  ],
                                  "additionalProperties": false
                                }
                              },
                              "sources": {
                                "type": "object",
                                "propertyNames": {
                                  "type": "string"
                                },
                                "additionalProperties": {
                                  "type": "number"
                                }
                              },
                              "published_columns": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              }
                            },
                            "required": [
                              "table_id",
                              "name",
                              "board_id",
                              "row_count",
                              "row_limit",
                              "columns",
                              "sources",
                              "published_columns"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "tables",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/data.query": {
      "post": {
        "operationId": "call_data_query",
        "summary": "Call data.query",
        "description": "Read rows from one Data table — 'which sponsors have no phone number?', 'show the ten newest venues' — with the same named-column filters, ordering and cursor paging as the product grid. It reads only. Not for the table's columns and limits — that is `data.api_describe`.\n\nEvery 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.",
        "tags": [
          "data"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "table_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The table being asked about."
                  },
                  "has_value_in": {
                    "description": "Only rows that HAVE a value in every one of these columns.",
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "missing_value_in": {
                    "description": "Only rows with NO value in any one of these columns — this is how you answer 'which of these have no phone?'.",
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "equals": {
                    "description": "Column key to exact value. Only for columns that exist on the table.",
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {
                      "type": "string"
                    }
                  },
                  "order_by": {
                    "description": "A column key to sort by. Leave it out for the natural order.",
                    "type": "string"
                  },
                  "descending": {
                    "description": "Sort the other way.",
                    "type": "boolean"
                  },
                  "limit": {
                    "description": "How many rows to bring back, at most 100. The total count is always returned whatever this is, so ask for few rows and report the count.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 100
                  },
                  "cursor": {
                    "description": "The `next_cursor` an earlier page answered with; leave it out for the first page.",
                    "type": "string"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "table_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "table_id": {
                          "type": "string"
                        },
                        "count_line": {
                          "type": "string"
                        },
                        "total": {
                          "type": "number"
                        },
                        "returned": {
                          "type": "number"
                        },
                        "rows": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "row_id": {
                                "type": "string"
                              },
                              "values": {
                                "type": "object",
                                "propertyNames": {
                                  "type": "string"
                                },
                                "additionalProperties": {}
                              },
                              "source": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "row_id",
                              "values",
                              "source"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "next_cursor": {
                          "description": "Present when more rows match: pass it as `cursor` for the next page.",
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "count_line",
                        "returned",
                        "rows",
                        "table_id",
                        "total",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/data.append": {
      "post": {
        "operationId": "call_data_append",
        "summary": "Call data.append",
        "description": "Add one validated row to a Data table — 'add Acme to the sponsors table', 'put a row in for the new venue'. Every value is checked against the table's columns, and reusing the same retry key never creates a second row. Not for changing a cell in an existing row — that is `data.api_update_cell`.\n\nEvery 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.",
        "tags": [
          "data"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "table_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The table gaining a row."
                  },
                  "values": {
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {},
                    "description": "The row, keyed by column key. Every key must be a column on the table — an unknown one is REFUSED, never dropped, so add the column first. Values are coerced to their column's type or refused."
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "table_id",
                  "values"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "table_id": {
                          "type": "string"
                        },
                        "row_id": {
                          "type": "string"
                        },
                        "row_count": {
                          "type": "integer"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "row_count",
                        "row_id",
                        "table_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/data.update_cell": {
      "post": {
        "operationId": "call_data_update_cell",
        "summary": "Call data.update_cell",
        "description": "Change one cell of an existing row in a Data table — 'set Acme's status to signed', 'fix the phone number on that row'. The whole row is validated against the table's columns before it is written. Not for adding a new row — that is `data.api_append`.\n\nEvery 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.",
        "tags": [
          "data"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "table_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "row_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "column_key": {
                    "type": "string"
                  },
                  "value": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "number"
                      },
                      {
                        "type": "boolean"
                      },
                      {
                        "type": "null"
                      },
                      {
                        "type": "array",
                        "items": {}
                      },
                      {
                        "type": "object",
                        "propertyNames": {
                          "type": "string"
                        },
                        "additionalProperties": {}
                      }
                    ]
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "table_id",
                  "row_id",
                  "column_key",
                  "value"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "table_id": {
                          "type": "string"
                        },
                        "row_id": {
                          "type": "string"
                        },
                        "column_key": {
                          "type": "string"
                        },
                        "values": {
                          "type": "object",
                          "propertyNames": {
                            "type": "string"
                          },
                          "additionalProperties": {}
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "column_key",
                        "row_id",
                        "table_id",
                        "values",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/data.set_published_columns": {
      "post": {
        "operationId": "call_data_set_published_columns",
        "summary": "Call data.set_published_columns",
        "description": "Set exactly which columns of a Data table a public Page may read — 'let the site show the venue name and city', 'stop the page reading the email column'. It replaces the whole list: nothing is published implicitly, and a column left out is hidden from every Page. Not for changing the table's data — that is `data.api_update_cell`. 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.\n\nEvery 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.",
        "tags": [
          "data"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "table_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "published_columns": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "table_id",
                  "published_columns"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "table_id": {
                          "type": "string"
                        },
                        "published_columns": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/data.run_row_action": {
      "post": {
        "operationId": "call_data_run_row_action",
        "summary": "Call data.run_row_action",
        "description": "Press a row's button in a Data table, as a member clicking it would — 'process the Acme meeting', 'run the research button on that row'. A button is a column of type `action` (`data.api_describe` lists them); pressing it starts every automation built on its event with the row as input, and those may spend credits or send what they were built to send. It answers in two calls: without confirmation_id it proposes, names the table, button and row, and presses nothing; the same call again with that confirmation_id, on a member's own API key, presses it once. Not for adding a row — that is `data.api_append`.\n\nEvery 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.",
        "tags": [
          "data"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "table_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The table whose row button is pressed."
                  },
                  "row_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The row the button is pressed on, as `data.query` returned it."
                  },
                  "column_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 64,
                    "description": "The key of the table's `action` column — the button. `data.describe` lists it with `type: action` and the event it sends."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "table_id",
                  "row_id",
                  "column_key"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "event_key": {
                          "type": "string"
                        },
                        "matched": {
                          "type": "integer"
                        },
                        "started": {
                          "type": "integer"
                        },
                        "already_started": {
                          "type": "integer"
                        },
                        "not_queued": {
                          "type": "integer"
                        },
                        "over_cap": {
                          "type": "integer"
                        },
                        "refused_row": {
                          "type": "integer"
                        },
                        "count_line": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.read": {
      "post": {
        "operationId": "call_page_read",
        "summary": "Call page.read",
        "description": "Read one page in this workspace — 'what's the state of the pricing page?', 'is the landing page live?'. It reads only. Not for a captured lead on the page — that is `page.api_read_lead`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "site_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "name": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string"
                        },
                        "hostname": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "published_revision": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "published_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "updated_at": {
                          "type": "string"
                        },
                        "latest_revision": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "has_build": {
                          "type": "boolean"
                        },
                        "source_mode": {
                          "type": "string"
                        },
                        "pixels": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "label": {
                                "type": "string"
                              },
                              "enabled": {
                                "type": "boolean"
                              },
                              "configured": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "label",
                              "enabled",
                              "configured"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "other_live_count": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "board_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "board_id",
                        "has_build",
                        "hostname",
                        "latest_revision",
                        "name",
                        "other_live_count",
                        "pixels",
                        "published_at",
                        "published_revision",
                        "site_id",
                        "source_mode",
                        "status",
                        "updated_at",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.build_status": {
      "post": {
        "operationId": "call_page_build_status",
        "summary": "Call page.build_status",
        "description": "Read where one build of a page stands — 'did the last build finish?', 'why did the build fail?' — after proving the build belongs to that page; the status comes back sanitized. Not for the page's list of builds — that is `page.api_revisions`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "build_run_id": {
                    "type": "string",
                    "minLength": 1
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "site_id",
                  "build_run_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "build_run_id": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "pending",
                            "running",
                            "succeeded",
                            "failed",
                            "retrying"
                          ]
                        },
                        "revision": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "failure": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "code": {
                                  "type": "string",
                                  "description": "The rail's own failure taxonomy code."
                                },
                                "message": {
                                  "type": "string",
                                  "description": "The rail's customer-facing refusal sentence — never a stack trace or an internal id."
                                }
                              },
                              "required": [
                                "code",
                                "message"
                              ],
                              "description": "Why a `failed` build failed.",
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Present only when `status` is `\"failed\"`; `null` otherwise."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "build_run_id",
                        "failure",
                        "revision",
                        "site_id",
                        "status",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.publish": {
      "post": {
        "operationId": "call_page_publish",
        "summary": "Call page.publish",
        "description": "Propose, then confirm, putting one exact built version of a page on the public internet — 'publish the landing page', 'make the new version live'. Publishing is public, and nothing goes live until the confirmed call. Not for putting an earlier version back live — that is `page.api_rollback`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "confirmation_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "site_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "published"
                          ]
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "revision": {
                          "type": "string"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "hostname": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        },
                        "shared_dev_host": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "revision",
                        "site_id",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.read_lead": {
      "post": {
        "operationId": "call_page_read_lead",
        "summary": "Call page.read_lead",
        "description": "Read one captured lead that belongs to a specific Page in this workspace — 'show me the lead from the webinar page', 'who filled in this form?'. It reads only. Not for the page itself — that is `page.api_read`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "lead_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "site_id",
                  "lead_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "lead_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "fields": {
                          "type": "object",
                          "propertyNames": {
                            "type": "string"
                          },
                          "additionalProperties": {}
                        },
                        "email": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "name": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "submitted_at": {
                          "type": "string"
                        },
                        "crm_status": {
                          "type": "string",
                          "enum": [
                            "pending",
                            "synced",
                            "skipped",
                            "failed",
                            "abandoned"
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "crm_status",
                        "email",
                        "fields",
                        "lead_id",
                        "name",
                        "site_id",
                        "submitted_at",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.revisions": {
      "post": {
        "operationId": "call_page_revisions",
        "summary": "Call page.revisions",
        "description": "List a page's builds, newest first, with the one currently published flagged — 'what versions of this page are there?', 'which build is live?'. It reads only. Not for one build's status — that is `page.api_build_status`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "limit": {
                    "description": "How many builds to return, newest first. Default 20, maximum 100.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 100
                  },
                  "cursor": {
                    "description": "Where to continue: pass the `next_cursor` from the previous page, with the same filters. Omit it for the first page.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 512
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "site_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "published_revision": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "revisions": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "revision": {
                                "type": "string"
                              },
                              "origin": {
                                "type": "string"
                              },
                              "created_at": {
                                "type": "string"
                              },
                              "published": {
                                "type": "boolean"
                              },
                              "has_functions": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "revision",
                              "origin",
                              "created_at",
                              "published",
                              "has_functions"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "next_cursor": {
                          "description": "Present when there is another page: pass it back as `cursor` to read it. Absent on the last page.",
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "published_revision",
                        "revisions",
                        "site_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.rollback": {
      "post": {
        "operationId": "call_page_rollback",
        "summary": "Call page.rollback",
        "description": "Propose, then confirm, putting one exact earlier built version back on a page's live address — 'roll the live page back', 'put yesterday's version back up'. Visitors see it once confirmed. Not for publishing the newest build — that is `page.api_publish`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "revision": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The exact prior build to put back on the live address."
                  },
                  "confirmation_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "site_id",
                  "revision"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "published"
                          ]
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "revision": {
                          "type": "string"
                        },
                        "previous_revision": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "hostname": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        },
                        "shared_dev_host": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "revision",
                        "site_id",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.assets": {
      "post": {
        "operationId": "call_page_assets",
        "summary": "Call page.assets",
        "description": "List the images and files attached to a page's own board — 'what images does this page have?', 'list the files on the site board'. No download address is issued and nothing changes. Not for the page's own state — that is `page.api_read`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "limit": {
                    "description": "How many assets to return, newest first. Default 50, maximum 200.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 200
                  },
                  "cursor": {
                    "description": "Where to continue: pass the `next_cursor` from the previous page, with the same filters. Omit it for the first page.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 512
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "site_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "board_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "assets": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "board_item_id": {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                              },
                              "storage_object_id": {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                              },
                              "display_name": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "mime_type": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "byte_size": {
                                "anyOf": [
                                  {
                                    "type": "number"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "uploaded_at": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "board_item_id",
                              "storage_object_id",
                              "display_name",
                              "mime_type",
                              "byte_size",
                              "uploaded_at"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "next_cursor": {
                          "description": "Present when there is another page: pass it back as `cursor` to read it. Absent on the last page.",
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "assets",
                        "board_id",
                        "site_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.domains": {
      "post": {
        "operationId": "call_page_domains",
        "summary": "Call page.domains",
        "description": "Read every address a page answers on, each with its state and the DNS records still required — 'is my domain live yet?', 'what records do I still need?'. It reads only. Not for connecting a new domain — that is `page.api_domain_connect`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "site_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "domains": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "domain_id": {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                              },
                              "hostname": {
                                "type": "string"
                              },
                              "kind": {
                                "type": "string",
                                "enum": [
                                  "platform_subdomain",
                                  "custom"
                                ]
                              },
                              "state": {
                                "type": "string",
                                "enum": [
                                  "waiting_dns",
                                  "validating",
                                  "active",
                                  "failed",
                                  "redirected_externally"
                                ]
                              },
                              "steps": {
                                "type": "array",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "key": {
                                      "type": "string"
                                    },
                                    "name": {
                                      "type": "string"
                                    },
                                    "note": {
                                      "type": "string"
                                    },
                                    "state": {
                                      "type": "string"
                                    }
                                  },
                                  "required": [
                                    "key",
                                    "name",
                                    "note",
                                    "state"
                                  ],
                                  "additionalProperties": false
                                }
                              },
                              "records": {
                                "type": "array",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "type": {
                                      "type": "string",
                                      "enum": [
                                        "CNAME",
                                        "TXT"
                                      ]
                                    },
                                    "name": {
                                      "type": "string"
                                    },
                                    "value": {
                                      "type": "string"
                                    },
                                    "purpose": {
                                      "type": "string",
                                      "enum": [
                                        "routing",
                                        "certificate"
                                      ]
                                    }
                                  },
                                  "required": [
                                    "type",
                                    "name",
                                    "value",
                                    "purpose"
                                  ],
                                  "additionalProperties": false
                                }
                              },
                              "created_at": {
                                "type": "string"
                              },
                              "updated_at": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "domain_id",
                              "hostname",
                              "kind",
                              "state",
                              "steps",
                              "records",
                              "created_at",
                              "updated_at"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "domains",
                        "site_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.domain_connect": {
      "post": {
        "operationId": "call_page_domain_connect",
        "summary": "Call page.domain_connect",
        "description": "Connect a domain the customer already owns to one of their pages — 'connect mybrand.com to the landing page', 'use our own domain for this site'. It reserves the name, starts the certificate and returns the DNS records they must add; the domain is NOT live until those records resolve. Not for checking whether it is live yet — that is `page.api_domains`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "hostname": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The domain the customer already owns, e.g. `offers.example.com`."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "site_id",
                  "hostname"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "domain": {
                          "type": "object",
                          "properties": {
                            "domain_id": {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            "hostname": {
                              "type": "string"
                            },
                            "kind": {
                              "type": "string",
                              "enum": [
                                "platform_subdomain",
                                "custom"
                              ]
                            },
                            "state": {
                              "type": "string",
                              "enum": [
                                "waiting_dns",
                                "validating",
                                "active",
                                "failed",
                                "redirected_externally"
                              ]
                            }
                          },
                          "required": [
                            "domain_id",
                            "hostname",
                            "kind",
                            "state"
                          ],
                          "additionalProperties": false
                        },
                        "records": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "type": {
                                "type": "string",
                                "enum": [
                                  "CNAME",
                                  "TXT"
                                ]
                              },
                              "name": {
                                "type": "string"
                              },
                              "value": {
                                "type": "string"
                              },
                              "purpose": {
                                "type": "string",
                                "enum": [
                                  "routing",
                                  "certificate"
                                ]
                              }
                            },
                            "required": [
                              "type",
                              "name",
                              "value",
                              "purpose"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "domain",
                        "records",
                        "site_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.archive": {
      "post": {
        "operationId": "call_page_archive",
        "summary": "Call page.archive",
        "description": "Propose, then confirm, taking one page off the workspace's board, or putting it back with archived: false — 'archive the old promo page', 'bring back the page I archived'. It deletes nothing and is reversible in one call. Archiving a LIVE page is refused, because it would not take the page off the internet — relay that reason rather than retrying. Not for changing what visitors see — that is `page.api_publish`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "archived": {
                    "type": "boolean"
                  },
                  "confirmation_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "site_id",
                  "archived"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "archived",
                            "restored"
                          ]
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "name": {
                          "type": "string"
                        },
                        "archived_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "site_id",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.set_access": {
      "post": {
        "operationId": "call_page_set_access",
        "summary": "Call page.set_access",
        "description": "Propose, then confirm, making one page of a site members-only — so only signed-in members of the workspace can open it — or public again: 'make the team page private', 'open /pricing to everyone again'. A live site rebuilds and publishes itself with the change; a draft site's change lands with its next build. It sets one page by its path, never a pattern such as '/admin/*' — relay that refusal, which says a pattern is edited in the site's source. Not for publishing a built version — that is `page.api_publish`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "path": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 512
                  },
                  "access": {
                    "type": "string",
                    "enum": [
                      "members",
                      "public"
                    ]
                  },
                  "confirmation_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "site_id",
                  "path",
                  "access"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "unchanged",
                            "building",
                            "publishing"
                          ]
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "path": {
                          "type": "string"
                        },
                        "access": {
                          "type": "string",
                          "enum": [
                            "members",
                            "public"
                          ]
                        },
                        "name": {
                          "type": "string"
                        },
                        "member_routes": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "access",
                        "path",
                        "site_id",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/automations.create_board": {
      "post": {
        "operationId": "call_automations_create_board",
        "summary": "Call automations.create_board",
        "description": "Create one empty automation board in this workspace — 'start a new automation', 'make a blank automation for lead follow-up'. It lands where the key's new work starts (Splash Pad unless a Work here project is set; file it elsewhere with `work.file`). Nothing is scheduled and nothing runs, and a retry with the same retry identity returns the same board rather than a second one. Not for writing the automation's steps — that is `automations.api_author`.\n\nEvery 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.",
        "tags": [
          "automations"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "board_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "name": {
                          "type": "string"
                        },
                        "created": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "board_id",
                        "created",
                        "name",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/automations.author": {
      "post": {
        "operationId": "call_automations_author",
        "summary": "Call automations.author",
        "description": "Propose, then confirm, one complete draft version of an existing automation board — 'add a step that emails new leads', 'rewrite this automation to wait three days first'. Confirming validates the connector bindings, builder availability, the graph and the trigger before anything is written, and the version is saved as a draft that does not run. Not for switching a version on — that is `automations.api_activate`.\n\nEvery 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.",
        "tags": [
          "automations"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "description": "What this automation is called, in the member's words."
                  },
                  "description": {
                    "description": "One or two plain sentences saying what it is for.",
                    "type": "string",
                    "maxLength": 600
                  },
                  "steps": {
                    "minItems": 1,
                    "maxItems": 24,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "key": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 64,
                          "pattern": "^[a-z][a-z0-9_]*$",
                          "description": "A stable key: lowercase letters, digits and underscores, starting with a letter (gather_answers); later steps read its answer as steps.<key>."
                        },
                        "label": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 80,
                          "description": "The step's name in plain language."
                        },
                        "description": {
                          "description": "What this step does, in one sentence.",
                          "type": "string",
                          "maxLength": 400
                        },
                        "kind": {
                          "default": "automated",
                          "description": "What the step is. automated (the default, leave it off): runs an action by its implementation. ask: stops for a person or the contact, then carries on with the answer. wait: waits a set time, until a date, for something to happen, until a read says done, or for a callback. think: a model answers its instruction from the inputs it names, in the shape its JSON Schema declares. run: starts another automation of this workspace, and may wait for its answer. branch: sends the run down one of its edges by its rules. set: gives later steps the fields it names. loop: runs its body once for each item of a list, or until a test holds. code: JavaScript or Python, written when the step is set up with `automations.bind_step`. Every kind but automated and ask takes no implementation.",
                          "type": "string",
                          "enum": [
                            "automated",
                            "approval",
                            "code_step",
                            "delay",
                            "conversation",
                            "wait_for_event",
                            "compute",
                            "think",
                            "ask",
                            "loop",
                            "branch",
                            "set",
                            "wait",
                            "run",
                            "code"
                          ]
                        },
                        "implementation": {
                          "description": "An automated step's action, by its catalogue key: contact.add_tag, contact.remove_tag, email.send, notify.member, opportunity.move_stage, contact.update_field, data.query, data.write, automation.call, or a connected tool's connector.<app>.<tool>; an ask step's is automation.ask. An unknown key is refused by name and nothing is saved, so never invent one.",
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 200
                        },
                        "params": {
                          "description": "The step's settings, in its action's own shape: { \"tag\": \"hot\" } for contact.add_tag, { \"emailId\": \"<a saved email's id>\" } for email.send. Every action refuses a setting it does not take and names it, so ask the member rather than guessing one, and never pass settings without an implementation except on the kinds that take none. An ask step takes { \"target\": { \"kind\": \"member\" } or { \"kind\": \"role\", \"role\": \"admin\" } or { \"kind\": \"contact\" }, \"question\": \"…\", \"answerKind\": \"approve_decline\" or \"choice\" or \"text\", \"options\": [\"…\"], \"timeout\": \"P3D\" }: the timeout is required (ask the member for it), options only for choice, and a contact answers in text. Its answer is steps.<key>.outcome: approved, declined, answered or timed_out. A think step takes { \"instruction\": \"…\", \"inputs\": { \"<name>\": \"{{ steps.<key>.<field> }}\" }, \"schema\": <a JSON Schema> }: the schema is the answer's shape ({ \"type\": \"string\", \"enum\": [\"yes\", \"no\"] } for a decision; an object naming every field later steps read), and later steps read it at steps.<key>.answer. It reads the run only through its inputs, and may name a \"slot\": \"writing.standard\", \"writing.plus\", \"writing.max\" (the strongest writing last). To answer once for each item of a list, add \"items\": \"{{ steps.<key>.<list> }}\" (at most 20) and read each as {{ item }} in the inputs; the answers are steps.<key>.items[i].answer. When the work is many items and nobody waits on the answer (a nightly summary, sorting a list of replies), add \"timing\": \"batch\" and say so: the items go to the provider's batch rate, about half the usual price where the step's model has one, and the answers come back within hours rather than seconds. A wait step takes one of: { \"for\": \"P2D\" } (how long, an ISO 8601 duration, at most 90 days); { \"until\": \"2026-11-01T09:00\" } (a date-time in the workspace's zone, or one {{ … }} that gives an instant); { \"event\": { \"type\": \"tag_added\", \"tag\": \"…\" } or { \"type\": \"reply_received\" }, \"timeout\": \"P3D\" } (until that happens to the run's contact, at most 30 days); { \"poll\": { \"tool\": \"automation.call\" or \"connector.<app>.<tool>\", \"params\": { … }, \"until\": \"{{ json.status == 'done' }}\", \"every\": \"PT5M\" }, \"timeout\": \"PT1H\" }; or { \"callback\": { \"request\": { … }, \"expect\": <a JSON Schema> }, \"timeout\": \"PT15M\" }. A wait that times out fails as wait_timeout, and the step's on_error decides what happens next. A run step takes { \"workflow\": \"<an automation id in this workspace>\", \"mode\": \"wait\" or \"start\", \"input\": { … } }: wait holds this run until that one answers, read at steps.<key>.<field>; start sets it going and carries on. A set step's settings are the fields it gives later steps ({ \"total\": \"{{ … }}\", \"label\": \"…\" }), read at steps.<key>.<field>. A branch step takes { \"rules\": [ { \"name\": \"big_order\", \"if\": \"{{ trigger.payload.total > 500 }}\" } ], \"mode\": \"first\" } and no implementation: each edge out of it names the rule it follows in output, or \"else\" for the edge taken when no rule holds; mode \"all\" takes every rule that holds. A code step takes { \"language\": \"javascript\" or \"python\", \"instruction\": \"<what the code does>\", \"inputs\": { \"<name>\": \"{{ … }}\" }, \"output_schema\": <a JSON Schema> }; binding it writes the code, which reads only its inputs and has no network. A browser step reads a website on this workspace's browsing list: `implementation: \"platform.browser\"` with `{\"task\":\"…\",\"startUrl\":\"https://…\",\"output\":<a JSON Schema>,\"maxMinutes\":5}` (`output` when later steps read fields; up to 10 minutes). Its answer is at `stepResults.<key>.answer`. When `stepResults.<key>.outcome` is `needs_member` (a CAPTCHA, a sign-in code, a missing login, or a site off the list), follow it with an `ask` to the member quoting `stepResults.<key>.member_step`, then the same browser step again. Any setting, at any depth, reads the run's data with {{ … }} around one CEL expression. A value that is exactly one {{ … }} keeps its type (a number, a list, a map); with words around it, it is text. What an expression reads: trigger (what started the run: a webhook's body at trigger.payload.<field>, an app event's fields at trigger.event.payload.<field>); steps.<key> (an earlier step's answer: a table read's rows at steps.<key>.rows, each { row_id, values: { <column>: … } }; a think's at steps.<key>.answer); json (the step just before); item and index (inside a loop); run.id and run.contactId; contact.consent.email and contact.consent.sms. Operators: + - * / %, == != < <= > >=, && || !, cond ? a : b, x in list. Functions, each called by its bare name: size(x). For text: upper(s), lower(s), trim(s), replace(s, from, to), substring(s, start, end), split(s, sep), join(list, sep), s.contains(t), s.startsWith(t), test(s, re2), extract(s, re2), format(\"%s of %s\", [a, b]). For numbers: round(x), round(x, 2), floor(x), ceil(x), abs(x), sum(list), avg(list), min(list), max(list), int(x), double(x), string(x). For lists: list.map(x, expr), list.filter(x, cond), list.exists(x, cond), first(list), last(list), sort(list), sortBy(list, \"field\"), unique(list), slice(list, from, to). For maps: has(m.field), get(m, \"a.b\", default), pick(m, keys), merge(a, b), keys(m), values(m). For dates: now(), dateAdd(d, \"P1D\"), dateDiff(a, b, \"day\"), dateFormat(d, \"MMM d, h:mm a\", \"America/Chicago\") (yyyy MM dd HH mm, and a zone; UTC when none), startOf(d, \"week\"). A value that may be missing: coalesce(trigger.payload.nickname, \"friend\") gives a default, and coalesce(trigger.payload.company, omit) leaves that key out. Examples: \"Booking {{ trigger.payload.booking_id }} for {{ trigger.payload.guests }} guests\"; { \"open\": \"{{ size(steps.read_tasks.rows) }}\" }; \"{{ join(steps.read_tasks.rows.map(r, r.values.title), ', ') }}\". An expression that cannot be read, names a step that is not before this one, or gives the wrong kind of value is refused at save with its path and its fix.",
                          "type": "object",
                          "propertyNames": {
                            "type": "string"
                          },
                          "additionalProperties": {}
                        },
                        "delay": {
                          "type": "object",
                          "properties": {
                            "duration": {
                              "type": "object",
                              "properties": {
                                "days": {
                                  "type": "integer",
                                  "minimum": 0
                                },
                                "hours": {
                                  "type": "integer",
                                  "minimum": 0
                                },
                                "minutes": {
                                  "type": "integer",
                                  "minimum": 0
                                }
                              },
                              "additionalProperties": false
                            },
                            "until": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 2000
                                },
                                {
                                  "type": "object",
                                  "properties": {
                                    "path": {
                                      "type": "string"
                                    },
                                    "offset": {
                                      "type": "string"
                                    }
                                  },
                                  "required": [
                                    "path",
                                    "offset"
                                  ],
                                  "additionalProperties": false
                                }
                              ]
                            },
                            "timezone": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 64
                            }
                          },
                          "additionalProperties": false
                        },
                        "waitForEvent": {
                          "type": "object",
                          "properties": {
                            "event": {
                              "type": "string",
                              "enum": [
                                "tag_added",
                                "reply_received"
                              ]
                            },
                            "tag": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 200
                            },
                            "timeoutMinutes": {
                              "type": "integer",
                              "minimum": 5,
                              "maximum": 43200
                            }
                          },
                          "required": [
                            "event",
                            "timeoutMinutes"
                          ],
                          "additionalProperties": false
                        },
                        "outputs": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 64,
                            "pattern": "^(?!__)"
                          }
                        },
                        "promptFirst": {
                          "default": true,
                          "type": "boolean"
                        },
                        "retries": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "retry": {
                          "description": "Only when the member wants an action tried again after it fails (a service that was briefly down): { \"max\": 3, \"wait\": \"PT10S\" }, at most 5 more tries, at most 30 seconds apart. Only on an action step or a callback wait; a think retries on its own.",
                          "type": "object",
                          "properties": {
                            "max": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 5
                            },
                            "wait": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "max"
                          ],
                          "additionalProperties": false
                        },
                        "on_error": {
                          "description": "What happens when this step fails. stop (the default, leave it off) ends the run there. continue carries on to the next step, which can read steps.<key>.ok (false) and steps.<key>.code. route follows this step's edge with output \"error\" instead of its usual next step: add that edge.",
                          "type": "string",
                          "enum": [
                            "stop",
                            "continue",
                            "route"
                          ]
                        },
                        "loop": {
                          "description": "A loop step: \"items\" (one {{ … }} that gives the list; the body reads {{ item }} and {{ index }}) or \"repeat\" ({ \"max\": 5 } times, or { \"until\": \"{{ json.done }}\", \"max\": 10 } over each round's answer), and its \"body\": an action, its params, and \"on_error\" (\"continue\" skips a failed item).",
                          "type": "object",
                          "properties": {
                            "items": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 2000
                            },
                            "repeat": {
                              "type": "object",
                              "properties": {
                                "until": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 2000
                                },
                                "max": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 500
                                }
                              },
                              "required": [
                                "max"
                              ],
                              "additionalProperties": false
                            },
                            "over": {
                              "type": "string",
                              "maxLength": 256,
                              "pattern": "^(?:initData|state|stepResults\\.[a-z][a-z0-9_]*)(?:\\.[^\\s.{}|]+)*$"
                            },
                            "until": {},
                            "while": {},
                            "concurrency": {
                              "type": "integer",
                              "minimum": 1
                            },
                            "onItemFailure": {
                              "type": "string",
                              "enum": [
                                "skip",
                                "stop",
                                "fail"
                              ]
                            },
                            "body": {
                              "type": "object",
                              "properties": {
                                "implementation": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 200
                                },
                                "params": {
                                  "type": "object",
                                  "propertyNames": {
                                    "type": "string"
                                  },
                                  "additionalProperties": {}
                                },
                                "retries": {
                                  "type": "integer",
                                  "minimum": 0
                                },
                                "retry": {
                                  "type": "object",
                                  "properties": {
                                    "max": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 5
                                    },
                                    "wait": {
                                      "type": "string"
                                    }
                                  },
                                  "required": [
                                    "max"
                                  ],
                                  "additionalProperties": false
                                },
                                "on_error": {
                                  "type": "string",
                                  "enum": [
                                    "stop",
                                    "continue",
                                    "route"
                                  ]
                                }
                              },
                              "required": [
                                "implementation"
                              ],
                              "additionalProperties": false
                            }
                          },
                          "required": [
                            "body"
                          ],
                          "additionalProperties": false
                        },
                        "sketch": {
                          "type": "boolean",
                          "const": true
                        },
                        "compute": {
                          "type": "object",
                          "properties": {
                            "task": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 80,
                              "pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$"
                            },
                            "payload": {
                              "default": {},
                              "type": "object",
                              "propertyNames": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 64,
                                "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$"
                              },
                              "additionalProperties": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 64
                              }
                            },
                            "resumeOn": {
                              "default": "completion",
                              "type": "string",
                              "enum": [
                                "completion"
                              ]
                            },
                            "reliability": {
                              "type": "object",
                              "properties": {
                                "deadlineMs": {
                                  "type": "integer",
                                  "minimum": 1000,
                                  "maximum": 21600000
                                },
                                "maxAttempts": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 10
                                },
                                "idempotencyKey": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 200,
                                  "pattern": "^[A-Za-z0-9{}][A-Za-z0-9_:.\\-{}]*$"
                                }
                              },
                              "required": [
                                "deadlineMs",
                                "maxAttempts",
                                "idempotencyKey"
                              ],
                              "additionalProperties": false
                            }
                          },
                          "required": [
                            "task"
                          ],
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "key",
                        "label"
                      ],
                      "additionalProperties": false
                    },
                    "description": "The steps, in the order they run. At most 24. An automated or ask step with no implementation is saved as a shape and refused when the automation is switched on."
                  },
                  "edges": {
                    "description": "Only when the run does not simply go through the steps in order: which step leads to which. Leave it out for a straight line; an empty list is refused.",
                    "maxItems": 64,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "from": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 64,
                          "pattern": "^[a-z][a-z0-9_]*$"
                        },
                        "to": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 64,
                          "pattern": "^[a-z][a-z0-9_]*$"
                        },
                        "when": {
                          "description": "Only on the two edges out of an A/B split, a step with implementation `flow.split` and params { \"percent\": 50 }: `{\"op\":\"eq\",\"left\":{\"path\":\"state.split_<that step's key>.arm\"},\"right\":{\"literal\":\"a\"}}` on the edge for the first share, `{\"op\":\"eq\",\"left\":{\"path\":\"state.split_<that step's key>.arm\"},\"right\":{\"literal\":\"b\"}}` on the other. Every other condition is a branch step's rule."
                        },
                        "on": {
                          "type": "string",
                          "const": "failure"
                        },
                        "whenLabel": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 80
                        },
                        "output": {
                          "description": "Which outcome this edge follows. Out of a branch: the name of the rule it follows, or \"else\" for the edge taken when no rule holds. Out of an ask: approved, declined, answered or timed_out; once one edge out of an ask names one, every edge out of it does, and an outcome with no edge ends the run. \"error\": the edge a step with on_error route follows when it fails.",
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 40
                        }
                      },
                      "required": [
                        "from",
                        "to"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "trigger": {
                    "description": "What fires it. Omit when the operator did not say — never invent a schedule.",
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "manual"
                          }
                        },
                        "required": [
                          "kind"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "webhook"
                          }
                        },
                        "required": [
                          "kind"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "schedule"
                          },
                          "cron": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120,
                            "description": "Five whitespace-separated cron fields, e.g. `0 9 * * 1`. Required for `schedule`."
                          },
                          "timezone": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 64,
                            "description": "An IANA timezone name, e.g. `America/Chicago`. Required for `schedule` — ask rather than assume one."
                          }
                        },
                        "required": [
                          "kind",
                          "cron",
                          "timezone"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "app_event"
                          },
                          "event_key": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120,
                            "description": "Which event fires it. Required for `app_event`. `crm.tag_applied` — When a tag is added to a contact in the CRM — any tag, or only the one tag you choose. `crm.tag_removed` — When a tag is taken off a contact in the CRM. `crm.contact_created` — When a new contact is added to the CRM. `crm.contact_updated` — When a contact's own details are edited in the CRM — optionally only when their email, name or phone changes. `crm.contact_deleted` — When a contact is removed from the CRM. `crm.opportunity_opened` — When a deal is created on one of your pipelines. `crm.opportunity_closed` — When a deal is won, lost or abandoned. `crm.stage_changed` — When a deal moves from one pipeline stage to another. `appointment.booked` — When someone books a time on one of your calendars. `appointment.status_changed` — When a booking is confirmed, showed, marked a no-show, or cancelled. `invoice.paid` — When an invoice is paid in full. `payment.received` — When an order is paid — the amount and currency come with it. `email.opened` — When a contact opens an email you sent them. `email.clicked` — When a contact clicks a link in an email you sent them. `email.bounced` — When an email to a contact could not be delivered. `inbox.reply_received` — When a contact replies on any channel your inbox carries. `inbox.tag_applied` — When someone puts a tag on a conversation in the inbox. `pages.lead.captured` — When someone submits a form on one of your published pages. `contact.date_reached` — When a contact's birthday comes round — on the day, or a chosen number of days before or after, at the time you choose. `board_row.date_reached` — When a date in one of your board tables comes round — on the day, or a chosen number of days before or after, at the time you choose. `automation.sequence_enrolled` — When another automation enrols someone into this sequence — the emails and waits below start for that person."
                          },
                          "changed_fields": {
                            "description": "ONLY for `crm.contact_updated`: narrow it to the fields the operator named, e.g. `[\"phone\"]` for \"when their phone number changes\". Omit for any change to the contact. Passing it with ANY OTHER event key is REFUSED — no other event says which fields changed, so a filter on one would match nothing and the automation would silently never run. A contact field we do not store — an address, a company, a custom field — cannot be named either, so say so rather than choosing a neighbouring one.",
                            "minItems": 1,
                            "maxItems": 3,
                            "type": "array",
                            "items": {
                              "type": "string",
                              "enum": [
                                "email",
                                "name",
                                "phone"
                              ]
                            }
                          },
                          "date_field": {
                            "description": "REQUIRED for `contact.date_reached`, and refused on every other key: WHICH stored date to watch. Only dates this product actually stores can be named — a renewal date or a CRM custom field cannot, so say so rather than choosing a neighbouring one.",
                            "anyOf": [
                              {
                                "type": "string",
                                "enum": [
                                  "date_of_birth"
                                ]
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "table_id": {
                                    "type": "string",
                                    "format": "uuid",
                                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                                  },
                                  "column_id": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 64
                                  }
                                },
                                "required": [
                                  "table_id",
                                  "column_id"
                                ],
                                "additionalProperties": false
                              }
                            ]
                          },
                          "offset_days": {
                            "description": "REQUIRED for `contact.date_reached`, and refused on every other key: how many days BEFORE the date to fire. `0` is on the day, `3` is three days before. Negative is not accepted — an anniversary that has passed is not a date being reached.",
                            "type": "integer",
                            "minimum": 0
                          },
                          "direction": {
                            "description": "For a date event: fire before (default) or after the date.",
                            "type": "string",
                            "enum": [
                              "before",
                              "after"
                            ]
                          },
                          "at_local_time": {
                            "description": "For a date event: the local time it fires, HH:MM (default 09:00).",
                            "type": "string",
                            "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$"
                          },
                          "timezone": {
                            "description": "An IANA timezone name, e.g. `America/Chicago`. Required for `schedule` — ask rather than assume one.",
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 64
                          },
                          "payload": {
                            "description": "For a `custom.<name>` event: its fields, each `{ name, type, required }` (type text, number, boolean, date, email or phone).",
                            "type": "object",
                            "properties": {
                              "fields": {
                                "type": "array",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "name": {
                                      "type": "string",
                                      "pattern": "^[a-z][a-z0-9_]{0,63}$"
                                    },
                                    "type": {
                                      "type": "string",
                                      "enum": [
                                        "text",
                                        "number",
                                        "boolean",
                                        "date",
                                        "email",
                                        "phone"
                                      ]
                                    },
                                    "required": {
                                      "type": "boolean"
                                    }
                                  },
                                  "required": [
                                    "name",
                                    "type"
                                  ],
                                  "additionalProperties": false
                                }
                              }
                            },
                            "required": [
                              "fields"
                            ],
                            "additionalProperties": false
                          },
                          "pipeline_stage_ids": {
                            "description": "ONLY for a deal event (`crm.opportunity_opened`, `crm.opportunity_closed`, `crm.stage_changed`): narrow it to the pipeline stages the operator named, e.g. the id of \"Proposal sent\" for \"when a deal reaches proposal\". Omit for any stage on any pipeline. These are the `id` values `pipeline.list` returns for the STAGES — never a GoHighLevel pipeline or stage ref, which would match nothing. Passing it with ANY OTHER event key is REFUSED — no other event says which stage it happened on, so a scope on one would match nothing and the automation would silently never run.",
                            "minItems": 1,
                            "maxItems": 40,
                            "type": "array",
                            "items": {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            }
                          },
                          "tag": {
                            "description": "For `crm.tag_applied`: the one tag name it waits for; omit for any tag.",
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 200
                          },
                          "form": {
                            "description": "For `pages.lead.captured`: the one page form it waits for, as page.read's `forms` names it; omit for any form. A form whose `event` is set starts through that `custom.*` event instead.",
                            "type": "string",
                            "pattern": "^[a-z0-9_-]{1,64}$"
                          }
                        },
                        "required": [
                          "kind",
                          "event_key"
                        ],
                        "additionalProperties": false
                      }
                    ]
                  },
                  "sketch_trigger": {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "enum": [
                          "manual",
                          "schedule",
                          "webhook",
                          "app_event"
                        ],
                        "description": "What will start it, before it is set up."
                      }
                    },
                    "required": [
                      "kind"
                    ],
                    "additionalProperties": false
                  },
                  "review_gated": {
                    "type": "boolean"
                  },
                  "callable": {
                    "type": "object",
                    "properties": {
                      "inputSchema": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string"
                        },
                        "additionalProperties": {}
                      },
                      "outputSchema": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string"
                        },
                        "additionalProperties": {}
                      },
                      "output": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string"
                        },
                        "additionalProperties": {}
                      }
                    },
                    "additionalProperties": false
                  },
                  "run_queue": {
                    "type": "string"
                  },
                  "error_workflow": {
                    "description": "Only when the member names one: the id of another automation in this workspace that runs whenever a run of this one fails. Its input names what failed, under failed: the run, the automation, the step, and why: its code and message. Leave it out on a change to keep the one already set.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "board_id",
                  "name",
                  "steps"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "saved"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "board_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expected_latest_version": {
                          "anyOf": [
                            {
                              "type": "integer",
                              "exclusiveMinimum": 0
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "version": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "display_name": {
                          "type": "string"
                        },
                        "created": {
                          "type": "boolean"
                        },
                        "status": {
                          "type": "string",
                          "const": "draft"
                        },
                        "bound_steps": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "unbound_steps": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "board_id",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/automations.activate": {
      "post": {
        "operationId": "call_automations_activate",
        "summary": "Call automations.activate",
        "description": "Propose, then confirm, switching on one exact reviewed version of an automation — 'turn this automation on', 'activate the version we just reviewed'. Once confirmed, that version is the one that runs. Not for writing or changing the steps — that is `automations.api_author`.\n\nEvery 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.",
        "tags": [
          "automations"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "board_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "activated"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "board_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "version": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "document_hash": {
                          "type": "string",
                          "pattern": "^[0-9a-f]{64}$"
                        },
                        "display_name": {
                          "type": "string"
                        },
                        "schedule_arming": {
                          "type": "string",
                          "enum": [
                            "not_a_schedule",
                            "flag_off",
                            "armed",
                            "kept_paused"
                          ]
                        },
                        "is_active": {
                          "type": "boolean"
                        },
                        "changed": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "board_id",
                        "display_name",
                        "document_hash",
                        "is_active",
                        "schedule_arming",
                        "state",
                        "version",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/pages.capabilities.catalogue": {
      "post": {
        "operationId": "call_pages_capabilities_catalogue",
        "summary": "Call pages.capabilities.catalogue",
        "description": "Read the live managed capability catalogue and one workload's effective policy — 'what can this site's workload do?', 'which capabilities are granted here?'. It reads only. Not for changing a policy, grant or approval — that is `pages.api_capabilities_configure`.\n\nEvery 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.",
        "tags": [
          "pages"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "target": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "site"
                          },
                          "site_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                          }
                        },
                        "required": [
                          "kind",
                          "site_id"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "workflow"
                          },
                          "workflow_definition_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                          },
                          "workflow_definition_version_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                          }
                        },
                        "required": [
                          "kind",
                          "workflow_definition_id",
                          "workflow_definition_version_id"
                        ],
                        "additionalProperties": false
                      }
                    ]
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "writing_tiers": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "operations": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string"
                              },
                              "leverage": {
                                "type": "string",
                                "enum": [
                                  "read",
                                  "write",
                                  "high-leverage"
                                ]
                              },
                              "requires_confirmation": {
                                "type": "boolean"
                              },
                              "supports_standing_approval": {
                                "type": "boolean"
                              },
                              "writing_tiers": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "managed_key_input_schema": {
                                "type": "object",
                                "propertyNames": {
                                  "type": "string"
                                },
                                "additionalProperties": {
                                  "anyOf": [
                                    {
                                      "anyOf": [
                                        {
                                          "type": "string"
                                        },
                                        {
                                          "type": "number"
                                        },
                                        {
                                          "type": "boolean"
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    },
                                    {
                                      "type": "array",
                                      "items": {}
                                    },
                                    {
                                      "type": "object",
                                      "propertyNames": {
                                        "type": "string"
                                      },
                                      "additionalProperties": {}
                                    }
                                  ]
                                }
                              }
                            },
                            "required": [
                              "key",
                              "leverage",
                              "requires_confirmation",
                              "supports_standing_approval",
                              "writing_tiers",
                              "managed_key_input_schema"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "effective": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "grant_id": {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                                },
                                "account_policy_id": {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                                },
                                "project_policy_id": {
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "format": "uuid",
                                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "operation_keys": {
                                  "type": "array",
                                  "items": {
                                    "type": "string"
                                  }
                                },
                                "allowed_tiers": {
                                  "type": "array",
                                  "items": {
                                    "type": "string"
                                  }
                                },
                                "default_tier": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "limits": {
                                  "type": "object",
                                  "properties": {
                                    "max_input_bytes": {
                                      "type": "integer",
                                      "exclusiveMinimum": 0
                                    },
                                    "max_output_tokens": {
                                      "type": "integer",
                                      "exclusiveMinimum": 0
                                    },
                                    "max_search_queries": {
                                      "type": "integer",
                                      "minimum": 0
                                    },
                                    "max_search_results": {
                                      "type": "integer",
                                      "minimum": 0
                                    },
                                    "max_tool_calls": {
                                      "type": "integer",
                                      "minimum": 0
                                    },
                                    "max_concurrent_requests": {
                                      "type": "integer",
                                      "exclusiveMinimum": 0
                                    }
                                  },
                                  "required": [
                                    "max_input_bytes",
                                    "max_output_tokens",
                                    "max_search_queries",
                                    "max_search_results",
                                    "max_tool_calls",
                                    "max_concurrent_requests"
                                  ],
                                  "additionalProperties": false
                                },
                                "rate_cap": {
                                  "anyOf": [
                                    {
                                      "type": "object",
                                      "properties": {
                                        "max_requests": {
                                          "type": "integer",
                                          "exclusiveMinimum": 0
                                        },
                                        "window_seconds": {
                                          "type": "integer",
                                          "minimum": 1,
                                          "maximum": 2678400
                                        },
                                        "window_starts_at": {
                                          "type": "string"
                                        },
                                        "window_resets_at": {
                                          "type": "string"
                                        }
                                      },
                                      "required": [
                                        "max_requests",
                                        "window_seconds",
                                        "window_starts_at",
                                        "window_resets_at"
                                      ],
                                      "additionalProperties": false
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "standing_approval": {
                                  "anyOf": [
                                    {
                                      "type": "object",
                                      "properties": {
                                        "id": {
                                          "type": "string",
                                          "format": "uuid",
                                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                                        },
                                        "disclosure_summary": {
                                          "type": "string"
                                        },
                                        "expires_at": {
                                          "anyOf": [
                                            {
                                              "type": "string"
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "standing_automation_id": {
                                          "anyOf": [
                                            {
                                              "type": "string",
                                              "format": "uuid",
                                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        }
                                      },
                                      "required": [
                                        "id",
                                        "disclosure_summary",
                                        "expires_at",
                                        "standing_automation_id"
                                      ],
                                      "additionalProperties": false
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              },
                              "required": [
                                "grant_id",
                                "account_policy_id",
                                "project_policy_id",
                                "operation_keys",
                                "allowed_tiers",
                                "default_tier",
                                "limits",
                                "rate_cap",
                                "standing_approval"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "effective",
                        "operations",
                        "writing_tiers",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/pages.capabilities.configure": {
      "post": {
        "operationId": "call_pages_capabilities_configure",
        "summary": "Call pages.capabilities.configure",
        "description": "Propose, then confirm, one exact managed policy, grant, standing approval, workflow enrollment or revocation — 'let this site run the lead workflow', 'revoke the image search grant'. Nothing changes until the confirmed call. Not for reading what is granted today — that is `pages.api_capabilities_catalogue`.\n\nEvery 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.",
        "tags": [
          "pages"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "configuration": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "policy"
                          },
                          "policy": {
                            "oneOf": [
                              {
                                "type": "object",
                                "properties": {
                                  "scope_kind": {
                                    "type": "string",
                                    "const": "account"
                                  },
                                  "workspace_id": {
                                    "type": "null"
                                  },
                                  "project_board_id": {
                                    "type": "null"
                                  },
                                  "policy_id": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "operation_keys": {
                                    "minItems": 1,
                                    "type": "array",
                                    "items": {
                                      "type": "string",
                                      "enum": [
                                        "pages.ai.generate_text",
                                        "web.search",
                                        "web.read",
                                        "web.image_search",
                                        "images.acquire_remote",
                                        "images.generate",
                                        "images.iterate",
                                        "workflow.invoke",
                                        "workflow.status",
                                        "connections.call"
                                      ]
                                    }
                                  },
                                  "allowed_tiers": {
                                    "type": "array",
                                    "items": {
                                      "type": "string",
                                      "minLength": 1
                                    }
                                  },
                                  "default_tier": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "minLength": 1
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "limits": {
                                    "type": "object",
                                    "properties": {
                                      "max_input_bytes": {
                                        "type": "integer",
                                        "exclusiveMinimum": 0
                                      },
                                      "max_output_tokens": {
                                        "type": "integer",
                                        "exclusiveMinimum": 0
                                      },
                                      "max_search_queries": {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      "max_search_results": {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      "max_tool_calls": {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      "max_concurrent_requests": {
                                        "type": "integer",
                                        "exclusiveMinimum": 0
                                      }
                                    },
                                    "required": [
                                      "max_input_bytes",
                                      "max_output_tokens",
                                      "max_search_queries",
                                      "max_search_results",
                                      "max_tool_calls",
                                      "max_concurrent_requests"
                                    ],
                                    "additionalProperties": false
                                  },
                                  "enabled": {
                                    "type": "boolean"
                                  },
                                  "activate": {
                                    "type": "boolean"
                                  }
                                },
                                "required": [
                                  "scope_kind",
                                  "workspace_id",
                                  "project_board_id",
                                  "policy_id",
                                  "operation_keys",
                                  "allowed_tiers",
                                  "default_tier",
                                  "limits",
                                  "enabled",
                                  "activate"
                                ],
                                "additionalProperties": false
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "scope_kind": {
                                    "type": "string",
                                    "const": "project"
                                  },
                                  "workspace_id": {
                                    "type": "string",
                                    "format": "uuid",
                                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                                  },
                                  "project_board_id": {
                                    "type": "string",
                                    "format": "uuid",
                                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                                  },
                                  "policy_id": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "operation_keys": {
                                    "minItems": 1,
                                    "type": "array",
                                    "items": {
                                      "type": "string",
                                      "enum": [
                                        "pages.ai.generate_text",
                                        "web.search",
                                        "web.read",
                                        "web.image_search",
                                        "images.acquire_remote",
                                        "images.generate",
                                        "images.iterate",
                                        "workflow.invoke",
                                        "workflow.status",
                                        "connections.call"
                                      ]
                                    }
                                  },
                                  "allowed_tiers": {
                                    "type": "array",
                                    "items": {
                                      "type": "string",
                                      "minLength": 1
                                    }
                                  },
                                  "default_tier": {
                                    "anyOf": [
                                      {
                                        "type": "string",
                                        "minLength": 1
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "limits": {
                                    "type": "object",
                                    "properties": {
                                      "max_input_bytes": {
                                        "type": "integer",
                                        "exclusiveMinimum": 0
                                      },
                                      "max_output_tokens": {
                                        "type": "integer",
                                        "exclusiveMinimum": 0
                                      },
                                      "max_search_queries": {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      "max_search_results": {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      "max_tool_calls": {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      "max_concurrent_requests": {
                                        "type": "integer",
                                        "exclusiveMinimum": 0
                                      }
                                    },
                                    "required": [
                                      "max_input_bytes",
                                      "max_output_tokens",
                                      "max_search_queries",
                                      "max_search_results",
                                      "max_tool_calls",
                                      "max_concurrent_requests"
                                    ],
                                    "additionalProperties": false
                                  },
                                  "enabled": {
                                    "type": "boolean"
                                  },
                                  "activate": {
                                    "type": "boolean"
                                  }
                                },
                                "required": [
                                  "scope_kind",
                                  "workspace_id",
                                  "project_board_id",
                                  "policy_id",
                                  "operation_keys",
                                  "allowed_tiers",
                                  "default_tier",
                                  "limits",
                                  "enabled",
                                  "activate"
                                ],
                                "additionalProperties": false
                              }
                            ]
                          }
                        },
                        "required": [
                          "kind",
                          "policy"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "grant"
                          },
                          "grant": {
                            "type": "object",
                            "properties": {
                              "account_policy_id": {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                              },
                              "project_policy_id": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "format": "uuid",
                                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "previous_grant_id": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "format": "uuid",
                                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "target": {
                                "oneOf": [
                                  {
                                    "type": "object",
                                    "properties": {
                                      "kind": {
                                        "type": "string",
                                        "const": "site"
                                      },
                                      "site_id": {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                                      },
                                      "target_board_id": {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                                      }
                                    },
                                    "required": [
                                      "kind",
                                      "site_id",
                                      "target_board_id"
                                    ],
                                    "additionalProperties": false
                                  },
                                  {
                                    "type": "object",
                                    "properties": {
                                      "kind": {
                                        "type": "string",
                                        "const": "workflow"
                                      },
                                      "workflow_definition_id": {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                                      },
                                      "workflow_definition_version_id": {
                                        "type": "string",
                                        "format": "uuid",
                                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                                      }
                                    },
                                    "required": [
                                      "kind",
                                      "workflow_definition_id",
                                      "workflow_definition_version_id"
                                    ],
                                    "additionalProperties": false
                                  }
                                ]
                              },
                              "operation_keys": {
                                "minItems": 1,
                                "type": "array",
                                "items": {
                                  "type": "string",
                                  "enum": [
                                    "pages.ai.generate_text",
                                    "web.search",
                                    "web.read",
                                    "web.image_search",
                                    "images.acquire_remote",
                                    "images.generate",
                                    "images.iterate",
                                    "workflow.invoke",
                                    "workflow.status",
                                    "connections.call"
                                  ]
                                }
                              },
                              "allowed_tiers": {
                                "type": "array",
                                "items": {
                                  "type": "string",
                                  "minLength": 1
                                }
                              },
                              "default_tier": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "minLength": 1
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "limits": {
                                "type": "object",
                                "properties": {
                                  "max_input_bytes": {
                                    "type": "integer",
                                    "exclusiveMinimum": 0
                                  },
                                  "max_output_tokens": {
                                    "type": "integer",
                                    "exclusiveMinimum": 0
                                  },
                                  "max_search_queries": {
                                    "type": "integer",
                                    "minimum": 0
                                  },
                                  "max_search_results": {
                                    "type": "integer",
                                    "minimum": 0
                                  },
                                  "max_tool_calls": {
                                    "type": "integer",
                                    "minimum": 0
                                  },
                                  "max_concurrent_requests": {
                                    "type": "integer",
                                    "exclusiveMinimum": 0
                                  }
                                },
                                "required": [
                                  "max_input_bytes",
                                  "max_output_tokens",
                                  "max_search_queries",
                                  "max_search_results",
                                  "max_tool_calls",
                                  "max_concurrent_requests"
                                ],
                                "additionalProperties": false
                              },
                              "rate_cap": {
                                "anyOf": [
                                  {
                                    "type": "object",
                                    "properties": {
                                      "max_requests": {
                                        "type": "integer",
                                        "exclusiveMinimum": 0
                                      },
                                      "window_seconds": {
                                        "type": "integer",
                                        "minimum": 1,
                                        "maximum": 2678400
                                      }
                                    },
                                    "required": [
                                      "max_requests",
                                      "window_seconds"
                                    ],
                                    "additionalProperties": false
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "account_policy_id",
                              "project_policy_id",
                              "previous_grant_id",
                              "target",
                              "operation_keys",
                              "allowed_tiers",
                              "default_tier",
                              "limits"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "required": [
                          "kind",
                          "grant"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "standing_approval"
                          },
                          "standing_approval": {
                            "type": "object",
                            "properties": {
                              "grant_id": {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                              },
                              "disclosure_summary": {
                                "type": "string",
                                "minLength": 1
                              },
                              "expires_at": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "format": "date-time",
                                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "standing_automation_id": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "format": "uuid",
                                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "grant_id",
                              "disclosure_summary",
                              "expires_at",
                              "standing_automation_id"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "required": [
                          "kind",
                          "standing_approval"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "grant_revoke"
                          },
                          "grant_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                          }
                        },
                        "required": [
                          "kind",
                          "grant_id"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "standing_approval_revoke"
                          },
                          "standing_approval_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                          }
                        },
                        "required": [
                          "kind",
                          "standing_approval_id"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "workflow_enrollment"
                          },
                          "site_grant_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                          },
                          "workflow_grant_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                          },
                          "standing_automation_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                          },
                          "site_standing_approval_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                          },
                          "workflow_standing_approval_id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                          },
                          "previous_enrollment_id": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "kind",
                          "site_grant_id",
                          "workflow_grant_id",
                          "standing_automation_id",
                          "site_standing_approval_id",
                          "workflow_standing_approval_id",
                          "previous_enrollment_id"
                        ],
                        "additionalProperties": false
                      }
                    ]
                  },
                  "confirmation_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "configuration"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "configured",
                            "enrollment_pending"
                          ]
                        },
                        "kind": {
                          "type": "string",
                          "enum": [
                            "policy",
                            "grant",
                            "standing_approval",
                            "grant_revoke",
                            "standing_approval_revoke",
                            "workflow_enrollment"
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "disclosure_summary": {
                          "type": "string"
                        },
                        "policy_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "version_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "version": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "activated": {
                          "type": "boolean"
                        },
                        "grant_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "grant_saved": {
                          "type": "boolean"
                        },
                        "runtime_credential": {
                          "type": "string",
                          "enum": [
                            "ready",
                            "not_required",
                            "enrollment_pending"
                          ]
                        },
                        "enrollment_error_code": {
                          "type": "string"
                        },
                        "standing_approval_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "standing_approval": {
                          "type": "string",
                          "enum": [
                            "ready",
                            "not_required",
                            "pending"
                          ]
                        },
                        "standing_approval_error_code": {
                          "type": "string"
                        },
                        "enrollment_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "workflow_definition_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "workflow_definition_version_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "service_actor_user_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "service_actor_role": {
                          "type": "string"
                        },
                        "changed": {
                          "type": "boolean"
                        },
                        "standing_approvals_revoked": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "managed_keys_revoked": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "request_replayed": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "kind",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/workflow.invoke": {
      "post": {
        "operationId": "call_workflow_invoke",
        "summary": "Call workflow.invoke",
        "description": "Run one explicitly enrolled managed automation through to its result — 'run the lead workflow now', 'send this form through the enrolment automation'. It waits for the run's terminal result. Not for checking on a run already started — that is `workflow.api_status`.\n\nEvery 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.",
        "tags": [
          "workflow"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "enrollmentId": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The active managed workflow enrollment to invoke at its pinned version."
                  },
                  "input": {
                    "default": {},
                    "description": "The workflow input object; omit it when no input is needed.",
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {
                      "anyOf": [
                        {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "number"
                            },
                            {
                              "type": "boolean"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        {
                          "type": "array",
                          "items": {}
                        },
                        {
                          "type": "object",
                          "propertyNames": {
                            "type": "string"
                          },
                          "additionalProperties": {}
                        }
                      ]
                    }
                  },
                  "confirmation_id": {
                    "description": "Confirms the stored exact call. When supplied, the stored request replaces all other body fields.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "idempotency_key": {
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 256
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false,
                "required": []
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "completed",
                            "reconciliation_required",
                            "terminal_replay"
                          ]
                        },
                        "confirmation_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "status": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "succeeded",
                                "failed",
                                "uncertain",
                                "running"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "response": {
                          "anyOf": [
                            {},
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "error_code": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/workflow.status": {
      "post": {
        "operationId": "call_workflow_status",
        "summary": "Call workflow.status",
        "description": "Read the saved status of one managed automation run — 'did that workflow finish?', 'what happened to the last run?'. It reads only. Not for starting a run — that is `workflow.api_invoke`.\n\nEvery 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.",
        "tags": [
          "workflow"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "invocationRequestId": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The original managed workflow invocation request whose durable status should be read."
                  },
                  "confirmation_id": {
                    "description": "Confirms the stored exact call. When supplied, the stored request replaces all other body fields.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "idempotency_key": {
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 256
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false,
                "required": []
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "completed",
                            "reconciliation_required",
                            "terminal_replay"
                          ]
                        },
                        "confirmation_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "status": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "succeeded",
                                "failed",
                                "uncertain",
                                "running"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "response": {
                          "anyOf": [
                            {},
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "error_code": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.call": {
      "post": {
        "operationId": "call_connections_call",
        "summary": "Call connections.call",
        "description": "Make one request with a connection this site bound by name, from the site's own code and its own key — 'look up the customer in Stripe', 'add the contact to our CRM'. It sends one HTTPS request to that connection's host, signed in with its credential, which never reaches the site; GET and HEAD read, every other method changes something on the provider's side. Only a site's own managed key can call it. Not for the brand's chat — that is the member's `connections.call` in Goosy.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "connection": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 64,
                    "description": "The name this site bound the connection under."
                  },
                  "method": {
                    "type": "string",
                    "minLength": 1,
                    "description": "GET, HEAD, POST, PUT, PATCH or DELETE."
                  },
                  "path": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The path on the connection's host, beginning with one /."
                  },
                  "query": {
                    "description": "Query string parameters, name to value.",
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {
                      "type": "string"
                    }
                  },
                  "headers": {
                    "description": "Extra request headers; never a credential — the connection signs the request in.",
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {
                      "type": "string"
                    }
                  },
                  "body": {
                    "anyOf": [
                      {
                        "anyOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "number"
                          },
                          {
                            "type": "boolean"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      {
                        "type": "array",
                        "items": {}
                      },
                      {
                        "type": "object",
                        "propertyNames": {
                          "type": "string"
                        },
                        "additionalProperties": {}
                      }
                    ],
                    "description": "The JSON body. A GET or HEAD sends none."
                  },
                  "confirmation_id": {
                    "description": "Confirms the stored exact call. When supplied, the stored request replaces all other body fields.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "idempotency_key": {
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 256
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false,
                "required": []
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "completed",
                            "reconciliation_required",
                            "terminal_replay"
                          ]
                        },
                        "confirmation_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "status": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "succeeded",
                                "failed",
                                "uncertain",
                                "running"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "response": {
                          "anyOf": [
                            {},
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "error_code": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/desk.build_card": {
      "post": {
        "operationId": "call_desk_build_card",
        "summary": "Call desk.build_card",
        "description": "Write a small custom card for this workspace — 'build me a calculator for this', 'make a countdown to the launch' — a little self-contained page, coded from the brief you give it, rendered in a sandbox and readable at its own address. Use it when what is wanted is not one of the ordinary elements: a bespoke view, a calculator, a countdown, a table shaped a particular way. Carry the operator's own sentence into brief; it is the whole instruction the card is written from. If the card needs live data, pass every Data table it may read in data_table_ids — a table you do not pass is a table the card can never see. This runs a PAID authoring session, so it answers in two calls on every key: without confirmation_id it describes what would be built, charges nothing and returns a confirmation_id; the same call again with that confirmation_id, on a member's own API key, builds it. Not for putting the card on a desk or project — that is `work.file`, with the card_id it answers as a widget's item_id.\n\nEvery 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.",
        "tags": [
          "desk"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "description": "What to call the card — its label on the desk."
                  },
                  "brief": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 4000,
                    "description": "What the card should show, in the member's own words."
                  },
                  "data_table_ids": {
                    "description": "Every Data table this card may read, and the only ones. Leave it out for a card that reads nothing.",
                    "maxItems": 8,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                    }
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "title",
                  "brief"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "built",
                              "description": "built — the card exists. (The first call answers confirmation_required: nothing was written and nothing was charged.)"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "title": {
                          "type": "string",
                          "description": "What the card is called."
                        },
                        "card_id": {
                          "description": "Present once built — the card's durable identity.",
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "revision": {
                          "description": "Present once built — the build this card is now on.",
                          "type": "string"
                        },
                        "entry": {
                          "description": "Bundle-relative path of the document the frame loads.",
                          "type": "string"
                        },
                        "file_count": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "bytes": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "reads": {
                          "description": "What this build declared it may read, and the only ones.",
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "door_url": {
                          "description": "Present once built — a short-lived address that renders this card. Null when one could not be signed for this environment; the card is still built. Treat it as a secret: it is a bearer capability and it expires.",
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "title",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/posts.read_piece": {
      "post": {
        "operationId": "call_posts_read_piece",
        "summary": "Call posts.read_piece",
        "description": "Read where one post piece stands — 'is this post ready to send', 'what's still missing on this piece', 'when does it go out'. It returns the piece's copy, its destinations and their versions, its publish time, the steps it still needs and whether its approval was sent. It reads only and changes nothing. Not for the workspace's whole pipeline at once — that is `content.status`.\n\nEvery 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.",
        "tags": [
          "posts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "piece_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The piece's id, as content.create_request, content.status or schedule.read return it."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "piece_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "piece_id": {
                          "type": "string"
                        },
                        "title": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "format": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string"
                        },
                        "display_time_zone": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "The workspace's zone; every time here is UTC and renders in it."
                        },
                        "source_kind": {
                          "type": "string"
                        },
                        "source_ref": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "has_master_content": {
                          "type": "boolean"
                        },
                        "master_content": {
                          "type": "string",
                          "description": "The piece's own body copy."
                        },
                        "scheduled_for": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "The piece's own publish time, ISO 8601 UTC."
                        },
                        "variants": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "platform": {
                                "type": "string"
                              },
                              "has_copy": {
                                "type": "boolean"
                              },
                              "caption": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "publish_at": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "aspect_ratio": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "status": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "platform",
                              "has_copy",
                              "caption",
                              "publish_at",
                              "aspect_ratio",
                              "status"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "outstanding_steps": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          },
                          "description": "The steps this piece does not yet satisfy, in order — the same check the workspace's own board runs."
                        },
                        "retracted": {
                          "type": "boolean",
                          "description": "The answer that wrote this piece was withdrawn; it is never ready to send."
                        },
                        "ready_to_send": {
                          "type": "boolean"
                        },
                        "approval_status": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Its approval request's state, or null when none was sent."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "approval_status",
                        "display_time_zone",
                        "format",
                        "has_master_content",
                        "master_content",
                        "outstanding_steps",
                        "piece_id",
                        "ready_to_send",
                        "retracted",
                        "scheduled_for",
                        "source_kind",
                        "source_ref",
                        "status",
                        "title",
                        "variants",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/posts.set_schedule": {
      "post": {
        "operationId": "call_posts_set_schedule",
        "summary": "Call posts.set_schedule",
        "description": "Set or clear the time one post piece goes out — 'schedule this post for Tuesday at 9am', 'move the launch post to Friday', 'take the time off this piece'. The time is when the piece reaches its audience on every destination without a time of its own, and nobody is asked again at that moment. A time someone changed in between is refused rather than overwritten. Not for reading the piece's current time — that is `posts.api_read_piece`. 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.\n\nEvery 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.",
        "tags": [
          "posts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "piece_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The piece's id, as content.create_request, content.status or schedule.read return it."
                  },
                  "scheduled_for": {
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "When the piece goes out, ISO 8601 with a Z or an offset; null clears the time. Pass it on both calls."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "piece_id",
                  "scheduled_for"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "enum": [
                                "confirmation_required",
                                "scheduled"
                              ]
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "piece_id": {
                          "type": "string"
                        },
                        "scheduled_for": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "The publish time this call sets (or set), ISO 8601 UTC."
                        },
                        "previous_scheduled_for": {
                          "description": "The piece's publish time when the confirmation was issued.",
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/posts.plan_context": {
      "post": {
        "operationId": "call_posts_plan_context",
        "summary": "Call posts.plan_context",
        "description": "Read what a posting plan has to work with — 'what slots are open this week', 'which finished videos could we post from', 'where can a carousel go'. It returns the workspace's open cadence slots over the next days (and whether each is already filled), the finished videos in its library with the date a slot binds each to, the destinations a piece of the chosen format may go to, and the zone every time renders in. It reads only and changes nothing. Not for one piece's own state — that is `posts.api_read_piece`.\n\nEvery 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.",
        "tags": [
          "posts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "piece_format": {
                    "description": "Which format's destination catalogue to return. Omit for `posts` — carousels and single posts, the common case. Only pass another when the brief is explicitly about stories, shorts/clips or long form.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "posts",
                          "stories",
                          "shorts_clips",
                          "long_form",
                          "articles",
                          "podcast"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "days_ahead": {
                    "description": "How many days of open cadence slots to read, from now. Omit for 7 (\"this week\"). Raise it only when the brief names a longer span.",
                    "anyOf": [
                      {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 60
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "display_time_zone": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "The workspace's zone; every time here is UTC and renders in it."
                        },
                        "open_slots": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "slot_id": {
                                "type": "string"
                              },
                              "destination": {
                                "type": "string"
                              },
                              "publish_at": {
                                "type": "string"
                              },
                              "status": {
                                "type": "string"
                              },
                              "filled": {
                                "type": "boolean",
                                "description": "Something is already bound to this slot."
                              }
                            },
                            "required": [
                              "slot_id",
                              "destination",
                              "publish_at",
                              "status",
                              "filled"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "finals": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "source_ref": {
                                "type": "string",
                                "description": "The finished video's id."
                              },
                              "title": {
                                "type": "string"
                              },
                              "status": {
                                "type": "string"
                              },
                              "bound_publish_at": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ],
                                "description": "When a cadence slot has it going out, or null."
                              }
                            },
                            "required": [
                              "source_ref",
                              "title",
                              "status",
                              "bound_publish_at"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "electable_platforms": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          },
                          "description": "The destinations a piece of this format may be put on."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "display_time_zone",
                        "electable_platforms",
                        "finals",
                        "open_slots",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/posts.create_pieces": {
      "post": {
        "operationId": "call_posts_create_pieces",
        "summary": "Call posts.create_pieces",
        "description": "Create every post a brief calls for, in one call — 'make this week's posts from Tuesday's episode', 'create three posts for the launch'. Each piece is created with whatever the request already settles — what it is built from, where it goes, its own copy, its time — and gets its board, so a complete request needs no further calls beyond each destination's version. Read posts.plan_context first so slot ids, library ids and destination names are real. It creates drafts only: nothing is published or sent for approval. Not for reading where one piece stands afterwards — that is `posts.api_read_piece`.\n\nEvery 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.",
        "tags": [
          "posts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "pieces": {
                    "minItems": 1,
                    "maxItems": 12,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "title": {
                          "type": "string",
                          "minLength": 1,
                          "description": "What the operator would call this piece. Short and human — it labels the tile on their grid."
                        },
                        "piece_format": {
                          "description": "Omit for `posts`.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "posts",
                                "stories",
                                "shorts_clips",
                                "long_form",
                                "articles",
                                "podcast"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "schedule_slot_id": {
                          "description": "The open cadence slot from posts.plan_context this piece fills. The slot supplies the destinations AND the time, so passing it means you do not pass `platforms` or `scheduled_for` at all. Omit it for a piece the cadence has no slot for.",
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "platforms": {
                          "description": "Where this piece publishes. Omit when `schedule_slot_id` is set — the slot's own defaults are the operator's rhythm and restating them is what drifts. Pass ONLY values posts.plan_context listed as electable; anything else is refused.",
                          "anyOf": [
                            {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "master_content": {
                          "description": "The piece's own copy — the canonical version every destination's variant is shaped from. Write it here when the brief gives you enough to; otherwise omit and fill it later with posts.fill_step.",
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "source_kind": {
                          "description": "What this piece is built from. Use `video_unit` with the id from posts.plan_context's finals list when the brief names an episode. `scratch` (the default) means written in the flow and takes NO source_ref.",
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "video_unit",
                                "image",
                                "document",
                                "scratch"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "source_ref": {
                          "description": "The id of the final named by `source_kind`. Required for every kind but `scratch`, and forbidden for `scratch`.",
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "scheduled_for": {
                          "description": "When this piece goes out: the operator's LOCAL date and time as `YYYY-MM-DDTHH:MM`, with no offset and no `Z` — the date from the `calendar` posts.plan_context returned, the time as they said it. The server converts it in `displayTimeZone`, so never convert it or add an offset yourself. Omit when `schedule_slot_id` is set. Pass it whenever the operator named a day or time, and never leave a named time out.",
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "title"
                      ],
                      "additionalProperties": false
                    },
                    "description": "Every piece the brief asks for, in ONE call. A week of posts is one call, not one call per post."
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "pieces"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "created": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "index": {
                                "type": "integer",
                                "minimum": 0,
                                "description": "The piece's position in the request, from 0."
                              },
                              "piece_id": {
                                "type": "string"
                              },
                              "run_id": {
                                "type": "string",
                                "description": "The piece's workflow run."
                              }
                            },
                            "required": [
                              "index",
                              "piece_id",
                              "run_id"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "refused": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "index": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "code": {
                                "type": "string"
                              },
                              "message": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "index",
                              "code",
                              "message"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "replayed": {
                          "type": "boolean",
                          "description": "True when this is the first result of an earlier call with the same idempotency_key, returned without running anything again."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "created",
                        "refused",
                        "replayed",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/posts.fill_step": {
      "post": {
        "operationId": "call_posts_fill_step",
        "summary": "Call posts.fill_step",
        "description": "Write what a post is built from, its name and its own copy — 'here's what this post should say', 'this post is built from Tuesday's episode', 'rename this post'. Its copy is what every destination's version is shaped from, so write it before each destination's version. It saves the draft only; nothing is published or sent. Not for one destination's own version — that is `posts.api_save_variants`.\n\nEvery 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.",
        "tags": [
          "posts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "piece_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The piece's id, as posts.create_pieces, content.create_request, content.status or schedule.read return it."
                  },
                  "title": {
                    "description": "Rename the piece.",
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "source_kind": {
                    "description": "Step 1 — what this piece is built from. Moves as a PAIR with source_ref: `scratch` takes none, every other kind requires one.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "video_unit",
                          "image",
                          "document",
                          "scratch"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "source_ref": {
                    "description": "The id of the final named by source_kind.",
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "master_content": {
                    "description": "The piece's own copy — the canonical version every destination's version is shaped from.",
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "piece_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "piece_id": {
                          "type": "string"
                        },
                        "applied": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          },
                          "description": "What was saved on the piece: title, source, master_content."
                        },
                        "replayed": {
                          "type": "boolean",
                          "description": "True when this is the first result of an earlier call with the same idempotency_key, returned without running anything again."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "applied",
                        "piece_id",
                        "replayed",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/knowledge_source.list": {
      "post": {
        "operationId": "call_knowledge_source_list",
        "summary": "Call knowledge_source.list",
        "description": "See this workspace's knowledge sources — 'what sources do we have', 'is our blog already added', 'which pages did you suggest from our site'. List this workspace's knowledge sources — name, kind, the link or handle each points at, when it was last ingested, whether it is switched on and its status (ready, processing, paused, or suggested: a page Goosy proposed from the website that was never read) — plus the kinds knowledge_source.add accepts. Paused and suggested sources are listed only with include_disabled. Call this first when the operator talks about a source without naming an id. Not for searching what the sources say — that is `knowledge.search`.\n\nEvery 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.",
        "tags": [
          "knowledge_source"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "include_disabled": {
                    "description": "True to include the sources that are switched off: paused ones and suggestions (pages Goosy proposed from the website that were never read). Leave unset for the ones in use.",
                    "type": "boolean"
                  },
                  "limit": {
                    "description": "How many sources to return, at most 100.",
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "maximum": 100
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "sources": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "source_id": {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                              },
                              "kind": {
                                "type": "string"
                              },
                              "display_name": {
                                "type": "string"
                              },
                              "reference": {
                                "type": "string"
                              },
                              "ingestion_cadence": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "last_ingested_at": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "enabled": {
                                "type": "boolean"
                              },
                              "status": {
                                "type": "string",
                                "enum": [
                                  "ready",
                                  "processing",
                                  "paused",
                                  "suggested"
                                ]
                              },
                              "created_at": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "source_id",
                              "kind",
                              "display_name",
                              "reference",
                              "ingestion_cadence",
                              "last_ingested_at",
                              "enabled",
                              "status",
                              "created_at"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "total_count": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "enabled_count": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "accepted_kinds": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "accepted_kinds",
                        "enabled_count",
                        "sources",
                        "total_count",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/knowledge_source.add": {
      "post": {
        "operationId": "call_knowledge_source_add",
        "summary": "Call knowledge_source.add",
        "description": "Bring a new knowledge source into this workspace's brand knowledge base — 'add our blog as a source', 'ingest this competitor's site', 'keep this decision for everyone', 'remember this for the team', 'put what we agreed in the knowledge base'. Add a knowledge source to this workspace's brand knowledge base — a link, feed, YouTube channel, competitor handle, subreddit, an already-uploaded file, or a note: something the member asks you to save, remember or share with the team from this conversation, which every member's knowledge.search then finds. A member's chats are private to them, so a note is how a decision reaches the team; write it only when the member asks for it, never on your own. Reading a source or a note costs the workspace credits. Calling it raises the approval card showing what would be added, which is the operator's confirmation, so it can still be refused after you call it. Never say a source was added unless the result says so. Report the outcome from the result's status field, never from ingested: status 'ingested' means the source was read into the knowledge base just now; status 'catalogued' means it is saved but NOT read yet, so never claim the knowledge base already answers from it; status 'already_live' means it was ALREADY saved and read, so say it is already working and nothing needed doing — do not describe it as unread. Not for a fact about the brand itself that the member tells you (an offer, a location, a dated plan with no ask to save it for the team), which is `brand_kit.suggest`; not for reading one page right now without saving it — that is `web.read`. 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.\n\nEvery 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.",
        "tags": [
          "knowledge_source"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "kind": {
                    "type": "string",
                    "enum": [
                      "file_upload",
                      "url",
                      "rss_feed",
                      "competitor_handle",
                      "subreddit",
                      "youtube_channel",
                      "note"
                    ],
                    "description": "What this source is. Use 'note' for something the member asked you to save from this conversation, 'url' for a web page, 'youtube_channel' for a YouTube channel or video, 'rss_feed' for a feed, 'competitor_handle' or 'subreddit' for a monitored handle, 'file_upload' for a file already uploaded on the Knowledge screen."
                  },
                  "display_name": {
                    "type": "string",
                    "minLength": 2,
                    "description": "What the operator should see this source called, at least 2 characters. For a note, a short title naming the decision."
                  },
                  "reference": {
                    "description": "The link, handle or filename this source points at, at least 2 characters. Never invent one — take it from the operator. Leave it out for a note.",
                    "type": "string",
                    "minLength": 2
                  },
                  "text": {
                    "description": "For a note only: what to save, written from the conversation as plain sentences a colleague can read without it — the decision, its reasons and today's date, in the member's own facts. Never add a fact the conversation does not hold.",
                    "type": "string",
                    "minLength": 2
                  },
                  "ingestion_cadence": {
                    "description": "How often to re-read the source. Leave it out unless the member says how often: a web page then re-reads weekly, so its answers stay current.",
                    "type": "string",
                    "enum": [
                      "one_shot",
                      "weekly",
                      "on_demand"
                    ]
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "kind",
                  "display_name"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "source_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "ingested",
                            "catalogued",
                            "already_live"
                          ]
                        },
                        "ingested": {
                          "type": "boolean"
                        },
                        "chunk_count": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/knowledge_source.dismiss": {
      "post": {
        "operationId": "call_knowledge_source_dismiss",
        "summary": "Call knowledge_source.dismiss",
        "description": "Dismiss a source Goosy suggested from the website so it stops being offered — 'get rid of those suggested pages', 'dismiss the suggestions from our site', 'we don't need that suggested link'. A suggestion is a page the website crawl proposed that nobody switched on and nothing read: its status is 'suggested' in knowledge_source.list. Dismissing hides it from the source list and the crawl never offers it again; it removes nothing from the knowledge base, costs nothing, and adding the page as a source later brings it back. Call it once per suggestion. Never say a suggestion was dismissed unless the result says so. Not for a source that is already read or switched on — taking that out of the knowledge base is `knowledge_source.remove`.\n\nEvery 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.",
        "tags": [
          "knowledge_source"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "source_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The suggestion, as a UUID: a source whose status is 'suggested' in knowledge_source.list (call it with include_disabled true). Never invent one."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "source_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "source_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "display_name": {
                          "type": "string"
                        },
                        "dismissed": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "dismissed",
                        "display_name",
                        "source_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/knowledge_source.remove": {
      "post": {
        "operationId": "call_knowledge_source_remove",
        "summary": "Call knowledge_source.remove",
        "description": "Remove a knowledge source for good — 'delete that source', 'remove the old pricing page from our knowledge', 'take that competitor's site out of the knowledge base entirely'. It deletes the source and expires every passage it contributed, so no agent in this workspace retrieves from it again; this cannot be undone, and adding it back reads it afresh as a new source. Calling it raises the approval card showing the source's name and what it points at, which is the operator's confirmation, so call it on the ask; it can still be refused after you call it. Never say a source was removed unless the result says so. Pass the id of the source the operator named, from knowledge_source.list. Not for switching a source off while keeping it — that is `knowledge_source.disable`. 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.\n\nEvery 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.",
        "tags": [
          "knowledge_source"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "source_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The source, as a UUID. Take it from knowledge_source.list or from the conversation's context — never invent one."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "source_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "source_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "display_name": {
                          "type": "string"
                        },
                        "removed": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/posts.elect_platforms": {
      "post": {
        "operationId": "call_posts_elect_platforms",
        "summary": "Call posts.elect_platforms",
        "description": "Add destinations to a post — 'also post this to LinkedIn', 'put this one on Instagram too'. Each added destination gets an empty version of its own, so write and save that version afterwards or the piece is not ready to send. A destination already on the piece, or one the piece's format does not take, is refused and named. It adds only: dropping a destination is done in the product. Not for writing a destination's copy — that is `posts.api_save_variants`.\n\nEvery 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.",
        "tags": [
          "posts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "piece_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The piece's id, as posts.create_pieces, content.create_request, content.status or schedule.read return it."
                  },
                  "elect": {
                    "minItems": 1,
                    "maxItems": 12,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1
                    },
                    "description": "Destinations to ADD, as posts.plan_context lists them electable for this piece's format."
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "elect",
                  "piece_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "piece_id": {
                          "type": "string"
                        },
                        "elected": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "refused": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "platform": {
                                "type": "string"
                              },
                              "code": {
                                "type": "string"
                              },
                              "message": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "platform",
                              "code",
                              "message"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "replayed": {
                          "type": "boolean",
                          "description": "True when this is the first result of an earlier call with the same idempotency_key, returned without running anything again."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "elected",
                        "piece_id",
                        "refused",
                        "replayed",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/posts.save_variants": {
      "post": {
        "operationId": "call_posts_save_variants",
        "summary": "Call posts.save_variants",
        "description": "Save the version written for each destination of a post — 'save these captions for Instagram and LinkedIn', 'here's the LinkedIn version of this post'. It stores the words you send; it writes none itself. A destination must already be on the piece, each version must carry its words, and a destination that already published refuses, because its copy is the record of what went out. It saves the draft only; nothing is published. Not for the piece's own copy — that is `posts.api_fill_step`.\n\nEvery 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.",
        "tags": [
          "posts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "piece_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The piece's id, as posts.create_pieces, content.create_request, content.status or schedule.read return it."
                  },
                  "variants": {
                    "minItems": 1,
                    "maxItems": 12,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "platform": {
                          "type": "string",
                          "description": "The destination this version is for. Must already be elected."
                        },
                        "caption": {
                          "description": "This destination's version of the copy — what actually posts there.",
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The longer body, for destinations that have one (a YouTube description, a Google Business post). Omit where the destination only has a caption.",
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "publish_at": {
                          "description": "This destination's OWN time, ISO 8601 UTC — a per-platform offset from the piece's anchor. Omit unless the brief asked for one; the piece's own time covers every destination that has none.",
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "aspect_ratio": {
                          "description": "Override the managed default aspect for this destination. Omit unless the operator asked — the default is the managed configuration and is nearly always right.",
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "hashtags": {
                          "description": "The tags going out with THIS destination's version. Write them WITHOUT the leading # — the surface adds it, so a stored one doubles it. One word each, no spaces.",
                          "anyOf": [
                            {
                              "maxItems": 30,
                              "type": "array",
                              "items": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 100,
                                "pattern": "^#?[^\\s#@]+$"
                              }
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "alt_text": {
                          "description": "What the creative SHOWS, for a reader who cannot see it — the subject, what they are doing, the setting. Describe the image, never repeat the caption.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 1000
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "first_comment": {
                          "description": "The comment posted immediately behind the piece, where the destination has the convention. Omit on destinations that do not.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 2200
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "location_label": {
                          "description": "The place this post is tagged at, as a human label (\"Northwind Trading Co. · Portland, OR\"). Never invent one the operator has not given you.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 200
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "tagged_handles": {
                          "description": "The accounts tagged in this destination's version, WITHOUT the leading @. Only accounts the operator named — a tagged account is a claim about someone else.",
                          "anyOf": [
                            {
                              "maxItems": 20,
                              "type": "array",
                              "items": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 100,
                                "pattern": "^@?[^\\s@]+$"
                              }
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "story": {
                          "description": "Only on a stories piece: every frame of this destination's story, in order, plus when it expires, the highlight it is saved to and who may reply. Including this REPLACES the whole rail.",
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "frames": {
                                  "minItems": 1,
                                  "maxItems": 10,
                                  "type": "array",
                                  "items": {
                                    "type": "object",
                                    "properties": {
                                      "text_sticker": {
                                        "description": "The white pill laid over this frame's picture. A short line, not a caption — omit it where the picture speaks for itself.",
                                        "anyOf": [
                                          {
                                            "type": "string",
                                            "maxLength": 300
                                          },
                                          {
                                            "type": "null"
                                          }
                                        ]
                                      },
                                      "link_sticker_url": {
                                        "description": "Where this frame's link sticker sends a viewer. Only a destination the operator named.",
                                        "anyOf": [
                                          {
                                            "type": "string",
                                            "format": "uri"
                                          },
                                          {
                                            "type": "null"
                                          }
                                        ]
                                      },
                                      "link_sticker_label": {
                                        "description": "The words ON the link pill (\"See the menu\"). Ignored without link_sticker_url — a label with no destination is a pill that goes nowhere.",
                                        "anyOf": [
                                          {
                                            "type": "string",
                                            "maxLength": 60
                                          },
                                          {
                                            "type": "null"
                                          }
                                        ]
                                      },
                                      "music_label": {
                                        "description": "The track as the platform NAMES it (\"Golden Hour · JVKE\"). Only a track the operator picked — never one you chose for them.",
                                        "anyOf": [
                                          {
                                            "type": "string",
                                            "maxLength": 200
                                          },
                                          {
                                            "type": "null"
                                          }
                                        ]
                                      },
                                      "alt_text": {
                                        "description": "What THIS frame's picture shows, for a reader who cannot see it. Per frame — three frames are three different pictures.",
                                        "anyOf": [
                                          {
                                            "type": "string",
                                            "maxLength": 1000
                                          },
                                          {
                                            "type": "null"
                                          }
                                        ]
                                      },
                                      "poll": {
                                        "description": "The poll sticker on this frame. A question with two to four options; anything less is a question, not a poll.",
                                        "anyOf": [
                                          {
                                            "type": "object",
                                            "properties": {
                                              "question": {
                                                "type": "string",
                                                "maxLength": 200
                                              },
                                              "options": {
                                                "minItems": 2,
                                                "maxItems": 4,
                                                "type": "array",
                                                "items": {
                                                  "type": "string",
                                                  "maxLength": 60
                                                }
                                              }
                                            },
                                            "required": [
                                              "question",
                                              "options"
                                            ],
                                            "additionalProperties": false
                                          },
                                          {
                                            "type": "null"
                                          }
                                        ]
                                      },
                                      "mention_handles": {
                                        "description": "Accounts @-mentioned ON this frame, WITHOUT the leading @ — the surface adds it. Only accounts the operator named.",
                                        "anyOf": [
                                          {
                                            "maxItems": 10,
                                            "type": "array",
                                            "items": {
                                              "type": "string",
                                              "minLength": 1,
                                              "maxLength": 100,
                                              "pattern": "^@?[^\\s@]+$"
                                            }
                                          },
                                          {
                                            "type": "null"
                                          }
                                        ]
                                      },
                                      "duration_seconds": {
                                        "description": "How long this frame sits on screen. Omit for the platforms' own 5-second still.",
                                        "anyOf": [
                                          {
                                            "type": "integer",
                                            "minimum": 1,
                                            "maximum": 60
                                          },
                                          {
                                            "type": "null"
                                          }
                                        ]
                                      }
                                    },
                                    "additionalProperties": false
                                  },
                                  "description": "EVERY frame of this story, in order — the first entry is the frame a viewer sees first. This REPLACES the whole rail: any frame you do not list is removed."
                                },
                                "expires_at": {
                                  "description": "When the story stops being visible, ISO 8601 UTC. Normally 24 hours after it posts; omit unless the operator said otherwise.",
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "highlight_name": {
                                  "description": "The highlight the story is saved into after it expires. Only one the operator named.",
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "maxLength": 100
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "replies_mode": {
                                  "description": "WHO MAY REPLY to the story. Omit to leave the account's own default — never guess it.",
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "enum": [
                                        "everyone",
                                        "followers",
                                        "off"
                                      ]
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              },
                              "required": [
                                "frames"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "platform"
                      ],
                      "additionalProperties": false
                    },
                    "description": "Every destination's version, in ONE call. Each one must carry the words — a destination with only its name on it is refused, because there is nothing to put on the piece."
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "piece_id",
                  "variants"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "piece_id": {
                          "type": "string"
                        },
                        "saved": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "refused": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "platform": {
                                "type": "string"
                              },
                              "code": {
                                "type": "string"
                              },
                              "message": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "platform",
                              "code",
                              "message"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "replayed": {
                          "type": "boolean",
                          "description": "True when this is the first result of an earlier call with the same idempotency_key, returned without running anything again."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "piece_id",
                        "refused",
                        "replayed",
                        "saved",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/posts.add_take": {
      "post": {
        "operationId": "call_posts_add_take",
        "summary": "Call posts.add_take",
        "description": "Put a film already recorded onto a story that was waiting for one — 'use this clip for that story', 'attach my recording to this story'. The story stops waiting and its words are written over the film by a drafting run, which is model work charged to the workspace. A story that already has its take is left as it is. Not for trimming the film or changing its look: that is done in Videos, and no verb here does it. 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.\n\nEvery 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.",
        "tags": [
          "posts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "set_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The week the story is in."
                  },
                  "piece_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The story waiting on a take."
                  },
                  "video_unit_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The film they recorded or uploaded."
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "piece_id",
                  "set_id",
                  "video_unit_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "bound"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "piece_id": {
                          "type": "string"
                        },
                        "drafting": {
                          "type": "boolean",
                          "description": "True when the story's words are now being written over the film; false when it already had its take."
                        },
                        "replayed": {
                          "type": "boolean",
                          "description": "True when this is the first result of an earlier call with the same idempotency_key, returned without running anything again."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/posts.keep_idea": {
      "post": {
        "operationId": "call_posts_keep_idea",
        "summary": "Call posts.keep_idea",
        "description": "Keep one of the week's post ideas for drafting, or set it aside — 'keep this idea', 'skip that one'. Only kept ideas are drafted when the week is drafted, so say how many are kept afterwards. Name the idea by its own key, never by its position in the list. A week that changed while this ran is refused rather than overwritten. Not for creating a post directly — that is `posts.api_create_pieces`.\n\nEvery 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.",
        "tags": [
          "posts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "set_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The week the idea is in."
                  },
                  "idea_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 32,
                    "description": "Which moment of the week — the idea's own key, like `m2`."
                  },
                  "kept": {
                    "type": "boolean",
                    "description": "True to keep it for drafting, false to set it aside."
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "idea_key",
                  "kept",
                  "set_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "set_id": {
                          "type": "string"
                        },
                        "idea_key": {
                          "type": "string"
                        },
                        "kept": {
                          "type": "boolean"
                        },
                        "kept_count": {
                          "type": "integer",
                          "minimum": 0,
                          "description": "How many of the week's ideas are kept for drafting now."
                        },
                        "replayed": {
                          "type": "boolean",
                          "description": "True when this is the first result of an earlier call with the same idempotency_key, returned without running anything again."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "idea_key",
                        "kept",
                        "kept_count",
                        "replayed",
                        "set_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/posts.submit_for_approval": {
      "post": {
        "operationId": "call_posts_submit_for_approval",
        "summary": "Call posts.submit_for_approval",
        "description": "Send a finished post for approval — 'send this post for approval', 'submit this for review'. Read it with posts.read_piece first: a piece with steps still outstanding, no destinations, or withdrawn content is refused, and the refusal names why. This submits only; the approval itself is always a person's, in Reviews or on the piece, and nothing goes out without that approval. Not for setting when it goes out — that is `posts.set_schedule`.\n\nEvery 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.",
        "tags": [
          "posts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "piece_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The piece's id, as posts.create_pieces, content.create_request, content.status or schedule.read return it."
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "piece_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "submitted"
                        },
                        "piece_id": {
                          "type": "string"
                        },
                        "run_id": {
                          "type": "string",
                          "description": "The piece's workflow run."
                        },
                        "approval_surface": {
                          "type": "string",
                          "enum": [
                            "queue",
                            "inline"
                          ],
                          "description": "Where the approval now waits: the Reviews queue when a sign-off is configured, otherwise on the piece itself."
                        },
                        "requires_signoff": {
                          "type": "boolean"
                        },
                        "replayed": {
                          "type": "boolean",
                          "description": "True when this is the first result of an earlier call with the same idempotency_key, returned without running anything again."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "approval_surface",
                        "piece_id",
                        "replayed",
                        "requires_signoff",
                        "run_id",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/videos.list_footage": {
      "post": {
        "operationId": "call_videos_list_footage",
        "summary": "Call videos.list_footage",
        "description": "'what footage have we already uploaded', 'do we have any clips of this already' — list the footage already uploaded to this workspace: each file's id, name, length, when it landed, and whether a video already uses it. It changes nothing. Not for what a new video can be filed into — that is `videos.creation_context`.\n\nEvery 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.",
        "tags": [
          "videos"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "footage": {
                          "maxItems": 8,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "filename": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "duration_s": {
                                "anyOf": [
                                  {
                                    "type": "number"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "uploaded_at": {
                                "type": "string"
                              },
                              "status": {
                                "type": "string"
                              },
                              "already_used": {
                                "type": "boolean"
                              },
                              "used_by_video_id": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "used_by_video_name": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "id",
                              "filename",
                              "duration_s",
                              "uploaded_at",
                              "status"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "footage_count": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "more_footage": {
                          "type": "boolean"
                        },
                        "unused_count": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "partial_read": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "footage",
                        "footage_count",
                        "more_footage",
                        "partial_read",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/videos.creation_context": {
      "post": {
        "operationId": "call_videos_creation_context",
        "summary": "Call videos.creation_context",
        "description": "'what can I start a new video from', 'which slots are open for a new video' — read what a new video can be started on and filed into: the workspace's enabled production profiles and its open cadence slots in the next few weeks, each with its id. It changes nothing. Not for footage already uploaded — that is `videos.list_footage`.\n\nEvery 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.",
        "tags": [
          "videos"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "production_profiles": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "profile_key": {
                                "type": "string"
                              },
                              "label": {
                                "type": "string"
                              },
                              "description": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "id",
                              "profile_key",
                              "label",
                              "description"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "open_slots": {
                          "maxItems": 30,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "destination": {
                                "type": "string"
                              },
                              "publish_at": {
                                "type": "string"
                              },
                              "required_asset_type": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "id",
                              "destination",
                              "publish_at",
                              "required_asset_type"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "more_open_slots": {
                          "type": "boolean"
                        },
                        "slot_window_days": {
                          "type": "integer"
                        },
                        "partial_reads": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "more_open_slots",
                        "open_slots",
                        "partial_reads",
                        "production_profiles",
                        "slot_window_days",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/videos.read_edit": {
      "post": {
        "operationId": "call_videos_read_edit",
        "summary": "Call videos.read_edit",
        "description": "'what did you change in this edit', 'show me the edit log' — read back what the edit did to one video: every change as a plain sentence with its id, how long it runs now, the titles, the pictures, and the one line said about watching it back. If it answers edited: false, nobody has edited that video yet. It changes nothing. Not for making an edit — that is `videos.plan_edit`.\n\nEvery 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.",
        "tags": [
          "videos"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "video_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The video's id, as given in this conversation."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "video_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "video_id": {
                          "type": "string"
                        },
                        "edited": {
                          "type": "boolean"
                        },
                        "log": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "The log line's id — what `videos.undo_edit` takes."
                              },
                              "sentence": {
                                "type": "string",
                                "description": "The plain past-tense sentence a person reads under the player."
                              },
                              "kind": {
                                "type": "string",
                                "enum": [
                                  "hook_tightened",
                                  "pause_dropped",
                                  "captions_on",
                                  "insert_placed",
                                  "music_bed_laid",
                                  "scene_shortened",
                                  "transition_changed",
                                  "frame_moved",
                                  "put_on_screen",
                                  "hook_moved",
                                  "ending_looped",
                                  "graded",
                                  "fillers_cut",
                                  "retakes_cut",
                                  "studio_sound_on",
                                  "words_cut",
                                  "take_not_heard"
                                ]
                              },
                              "scene_id": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "minLength": 1,
                                    "description": "The scene's id, as given in the storyboard."
                                  },
                                  {
                                    "type": "null"
                                  }
                                ],
                                "description": "The scene's id, as given in the storyboard."
                              },
                              "undoable": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "id",
                              "sentence",
                              "kind",
                              "scene_id",
                              "undoable"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "titles": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "text": {
                                "type": "string"
                              },
                              "picked": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "id",
                              "text",
                              "picked"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "thumbnails": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "note": {
                                "type": "string"
                              },
                              "picked": {
                                "type": "boolean"
                              },
                              "drawn": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "id",
                              "note",
                              "picked",
                              "drawn"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "seconds": {
                          "type": "integer"
                        },
                        "clock": {
                          "type": "string"
                        },
                        "judge_line": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "waiting_on": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "step": {
                          "type": "string",
                          "enum": [
                            "idea",
                            "writing",
                            "storyboarded",
                            "needs_filming",
                            "edited",
                            "ready",
                            "scheduled",
                            "live"
                          ]
                        },
                        "open_at": {
                          "type": "string",
                          "description": "Where the person watches it."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "clock",
                        "edited",
                        "judge_line",
                        "log",
                        "open_at",
                        "seconds",
                        "step",
                        "thumbnails",
                        "titles",
                        "video_id",
                        "waiting_on",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/videos.write_script": {
      "post": {
        "operationId": "call_videos_write_script",
        "summary": "Call videos.write_script",
        "description": "'write the script for this video', 'rewrite the script to be more casual' — write one video's script from its plan, or rewrite it under one direction you pass. The answer carries the chapters and any facts the script still needs. This runs a PAID writing turn: on a member's own key it writes in one call; on a key with no member behind it the first call describes what would be written, charges nothing and returns a confirmation id, and the second, carrying that id back, is what writes it. Not for drawing the scenes — that is `videos.draw_storyboard`.\n\nEvery 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.",
        "tags": [
          "videos"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "video_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The video's id, as given in this conversation."
                  },
                  "direction": {
                    "description": "The direction for a fresh draft from the plan, in the person's own words. Leave it out for the first pass.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000
                  },
                  "confirmation_id": {
                    "description": "Only when a first call answered confirmation_required: send that id back, unchanged, to run the recorded request. On your own member key the first call already runs, and there is no id.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "idempotency_key": {
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "video_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "video_id": {
                          "type": "string"
                        },
                        "chapters": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "number": {
                                "type": "integer"
                              },
                              "name": {
                                "type": "string"
                              },
                              "text": {
                                "type": "string"
                              },
                              "seconds": {
                                "type": "integer"
                              },
                              "made_by": {
                                "type": "string",
                                "enum": [
                                  "you",
                                  "goosy"
                                ]
                              }
                            },
                            "required": [
                              "number",
                              "name",
                              "text",
                              "seconds",
                              "made_by"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "words": {
                          "type": "integer",
                          "description": "How long the script runs, in words."
                        },
                        "length_words": {
                          "type": "string"
                        },
                        "step": {
                          "type": "string",
                          "enum": [
                            "idea",
                            "writing",
                            "storyboarded",
                            "needs_filming",
                            "edited",
                            "ready",
                            "scheduled",
                            "live"
                          ]
                        },
                        "open_at": {
                          "type": "string",
                          "description": "Where the person reads it."
                        },
                        "questions": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string"
                              },
                              "ask": {
                                "type": "string",
                                "description": "The question, as the person reads it."
                              },
                              "why": {
                                "type": "string",
                                "description": "Why the script needs it."
                              },
                              "example": {
                                "type": "string",
                                "description": "One example answer."
                              }
                            },
                            "required": [
                              "key",
                              "ask",
                              "why",
                              "example"
                            ],
                            "additionalProperties": false
                          },
                          "description": "Facts Goosy needs and does not have. Ask the person these AS YOUR NEXT TURN, in your own words, in one message. Never answer one yourself and never guess: a made-up name, number or place ships in the finished video, and the video will not go down while a blank stands."
                        },
                        "questions_note": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Say this to the person, in your own words, INSTEAD of asking anything — the questions did not save. Never ask a question from `questions` in the same turn you say this."
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "written",
                            "in_flight"
                          ],
                          "description": "written — the script is written and below; in_flight — it is still running: nothing failed, do not send it again, follow job_id with jobs.read; confirmation_required — a key with no member behind it asked first: nothing ran and nothing was charged."
                        },
                        "job_id": {
                          "description": "The job's handle. Read its status with `jobs.read` (REST: POST /api/v1/tools/jobs.read) until it says succeeded or failed.",
                          "type": "string"
                        },
                        "confirmation_id": {
                          "description": "Present only while confirmation is required.",
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "description": "How long that confirmation stays usable.",
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "description": "Present only while confirmation is required — what will run, in one sentence, for a person to approve.",
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/videos.draw_storyboard": {
      "post": {
        "operationId": "call_videos_draw_storyboard",
        "summary": "Call videos.draw_storyboard",
        "description": "'storyboard this video', 'draw out the scenes for this script' — draw one video's storyboard from its script: every scene and its complete sheet. It does not draw the pictures. This runs a PAID writing turn: on a member's own key it draws in one call; on a key with no member behind it the first call describes what would be drawn, charges nothing and returns a confirmation id, and the second, carrying that id back, is what draws it. Not for writing the script — that is `videos.write_script`.\n\nEvery 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.",
        "tags": [
          "videos"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "video_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The video's id, as given in this conversation."
                  },
                  "wants": {
                    "description": "Anything the person said they want to see — a shot, a place, a thing on the desk.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000
                  },
                  "confirmation_id": {
                    "description": "Only when a first call answered confirmation_required: send that id back, unchanged, to run the recorded request. On your own member key the first call already runs, and there is no id.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "idempotency_key": {
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "video_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "video_id": {
                          "type": "string"
                        },
                        "scenes": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "number": {
                                "type": "integer"
                              },
                              "name": {
                                "type": "string"
                              },
                              "seconds": {
                                "type": "integer"
                              },
                              "at": {
                                "type": "string"
                              },
                              "source": {
                                "type": "string",
                                "enum": [
                                  "you",
                                  "goosy",
                                  "screen"
                                ]
                              },
                              "source_word": {
                                "type": "string"
                              },
                              "sheet": {
                                "type": "object",
                                "properties": {
                                  "said": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "on_screen": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "moves": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "sound": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "captions": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "voice": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "timing": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "layout": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "why": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "said",
                                  "on_screen",
                                  "moves",
                                  "sound",
                                  "captions",
                                  "voice",
                                  "timing",
                                  "layout",
                                  "why"
                                ],
                                "additionalProperties": false
                              },
                              "insert": {
                                "anyOf": [
                                  {
                                    "type": "object",
                                    "properties": {
                                      "line": {
                                        "type": "string"
                                      },
                                      "attribution": {
                                        "anyOf": [
                                          {
                                            "type": "string"
                                          },
                                          {
                                            "type": "null"
                                          }
                                        ]
                                      }
                                    },
                                    "required": [
                                      "line",
                                      "attribution"
                                    ],
                                    "additionalProperties": false
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "drawn": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "id",
                              "number",
                              "name",
                              "seconds",
                              "at",
                              "source",
                              "source_word",
                              "sheet",
                              "insert",
                              "drawn"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "length": {
                          "type": "string"
                        },
                        "step": {
                          "type": "string",
                          "enum": [
                            "idea",
                            "writing",
                            "storyboarded",
                            "needs_filming",
                            "edited",
                            "ready",
                            "scheduled",
                            "live"
                          ]
                        },
                        "needs_filming": {
                          "type": "boolean"
                        },
                        "look": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "look_note": {
                          "type": "string"
                        },
                        "open_at": {
                          "type": "string"
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "drawn",
                            "in_flight"
                          ],
                          "description": "drawn — the storyboard is drawn and below; in_flight — it is still running: nothing failed, do not send it again, follow job_id with jobs.read; confirmation_required — a key with no member behind it asked first: nothing ran and nothing was charged."
                        },
                        "job_id": {
                          "description": "The job's handle. Read its status with `jobs.read` (REST: POST /api/v1/tools/jobs.read) until it says succeeded or failed.",
                          "type": "string"
                        },
                        "confirmation_id": {
                          "description": "Present only while confirmation is required.",
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "description": "How long that confirmation stays usable.",
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "description": "Present only while confirmation is required — what will run, in one sentence, for a person to approve.",
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/videos.plan_edit": {
      "post": {
        "operationId": "call_videos_plan_edit",
        "summary": "Call videos.plan_edit",
        "description": "'edit this video', 'make it tighter', 'cut scene three shorter' — edit one video, optionally under a direction or for one scene, and return the log of what changed — or, if the edit is still running when this answers, state in_flight and a job_id to follow with `jobs.read` (do not send it again). A retry carrying the same idempotency_key is the same edit. This runs a PAID editing turn: on a member's own key it edits in one call; on a key with no member behind it the first call describes the edit, charges nothing and returns a confirmation id, and the second, carrying that id back, is what edits it. Not for reading an edit already made — that is `videos.read_edit`.\n\nEvery 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.",
        "tags": [
          "videos"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "video_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The video's id, as given in this conversation."
                  },
                  "direction": {
                    "description": "What to change, in the person's own words. Leave it out for Goosy's first edit.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000
                  },
                  "scene_id": {
                    "description": "ONE scene, when the person asked about one scene rather than the whole video.",
                    "type": "string",
                    "minLength": 1
                  },
                  "confirmation_id": {
                    "description": "Only when a first call answered confirmation_required: send that id back, unchanged, to run the recorded request. On your own member key the first call already runs, and there is no id.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "idempotency_key": {
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "video_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "video_id": {
                          "type": "string"
                        },
                        "log": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "The log line's id — what `videos.undo_edit` takes."
                              },
                              "sentence": {
                                "type": "string",
                                "description": "The plain past-tense sentence a person reads under the player."
                              },
                              "kind": {
                                "type": "string",
                                "enum": [
                                  "hook_tightened",
                                  "pause_dropped",
                                  "captions_on",
                                  "insert_placed",
                                  "music_bed_laid",
                                  "scene_shortened",
                                  "transition_changed",
                                  "frame_moved",
                                  "put_on_screen",
                                  "hook_moved",
                                  "ending_looped",
                                  "graded",
                                  "fillers_cut",
                                  "retakes_cut",
                                  "studio_sound_on",
                                  "words_cut",
                                  "take_not_heard"
                                ]
                              },
                              "scene_id": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "minLength": 1,
                                    "description": "The scene's id, as given in the storyboard."
                                  },
                                  {
                                    "type": "null"
                                  }
                                ],
                                "description": "The scene's id, as given in the storyboard."
                              },
                              "undoable": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "id",
                              "sentence",
                              "kind",
                              "scene_id",
                              "undoable"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "titles": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "text": {
                                "type": "string"
                              },
                              "picked": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "id",
                              "text",
                              "picked"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "seconds": {
                          "type": "integer"
                        },
                        "clock": {
                          "type": "string"
                        },
                        "honest_time": {
                          "type": "string"
                        },
                        "step": {
                          "type": "string",
                          "enum": [
                            "idea",
                            "writing",
                            "storyboarded",
                            "needs_filming",
                            "edited",
                            "ready",
                            "scheduled",
                            "live"
                          ]
                        },
                        "open_at": {
                          "type": "string",
                          "description": "Where the person watches it."
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "edited",
                            "in_flight"
                          ],
                          "description": "edited — the edit is made and its log is below; in_flight — it is still running: nothing failed, do not send it again, follow job_id with jobs.read; confirmation_required — a key with no member behind it asked first: nothing ran and nothing was charged."
                        },
                        "job_id": {
                          "description": "The job's handle. Read its status with `jobs.read` (REST: POST /api/v1/tools/jobs.read) until it says succeeded or failed.",
                          "type": "string"
                        },
                        "confirmation_id": {
                          "description": "Present only while confirmation is required.",
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "description": "How long that confirmation stays usable.",
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "description": "Present only while confirmation is required — what will run, in one sentence, for a person to approve.",
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/videos.generate_clip": {
      "post": {
        "operationId": "call_videos_generate_clip",
        "summary": "Call videos.generate_clip",
        "description": "'generate a clip for this scene', 'make this scene since we don't have real footage' — start a made clip for one storyboard scene when nothing real will do, and return its job handle. The clip is NOT ready when this answers; follow its job_id with `jobs.read`. A retry carrying the same idempotency_key returns the same clip, never a second one. This is PAID generation and needs the key holder to be a workspace admin: on a member's own key it starts in one call; on a key with no member behind it the first call describes the clip, charges nothing and returns a confirmation id, and the second, carrying that id back, is what starts it. Not for drawing the whole storyboard — that is `videos.draw_storyboard`.\n\nEvery 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.",
        "tags": [
          "videos"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "video_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The video's id, as given in this conversation."
                  },
                  "scene_id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The scene's id, as given in the storyboard."
                  },
                  "shows": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 600,
                    "description": "What the clip should show, in the scene's own words."
                  },
                  "seconds": {
                    "default": 5,
                    "description": "How long the clip runs inside the scene.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 15
                  },
                  "confirmation_id": {
                    "description": "Only when a first call answered confirmation_required: send that id back, unchanged, to run the recorded request. On your own member key the first call already runs, and there is no id.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "idempotency_key": {
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "scene_id",
                  "shows",
                  "video_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "video_id": {
                          "type": "string"
                        },
                        "scene_id": {
                          "type": "string"
                        },
                        "seconds": {
                          "type": "integer"
                        },
                        "marker": {
                          "type": "string"
                        },
                        "open_at": {
                          "type": "string"
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "started"
                          ],
                          "description": "started — the clip is being made; job_id is its handle and it is not ready yet; confirmation_required — a key with no member behind it asked first: nothing ran and nothing was charged."
                        },
                        "job_id": {
                          "description": "The job's handle. Read its status with `jobs.read` (REST: POST /api/v1/tools/jobs.read) until it says succeeded or failed.",
                          "type": "string"
                        },
                        "confirmation_id": {
                          "description": "Present only while confirmation is required.",
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "description": "How long that confirmation stays usable.",
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "description": "Present only while confirmation is required — what will run, in one sentence, for a person to approve.",
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/jobs.read": {
      "post": {
        "operationId": "call_jobs_read",
        "summary": "Call jobs.read",
        "description": "'is my clip done yet', 'did that edit finish' — read one long-running job's status by the job_id a call answered (videos.generate_clip, or an edit or draft that answered in_flight): queued, running, succeeded or failed, when it started and finished, and once it has succeeded what to read next. It changes nothing and starts nothing. Not for starting work — call the verb that makes it.\n\nEvery 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.",
        "tags": [
          "jobs"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The job_id a long-running call answered (for example videos.generate_clip)."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "job_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "job_id": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "queued",
                            "running",
                            "succeeded",
                            "failed"
                          ],
                          "description": "queued — accepted, not started; running — under way; succeeded — done, read `result`; failed — it stopped, see error_code."
                        },
                        "created_at": {
                          "type": "string",
                          "description": "When the job was asked for (ISO 8601)."
                        },
                        "started_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "When it started running, or null before it has."
                        },
                        "completed_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "When it finished, or null while it has not."
                        },
                        "result": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "type": {
                                  "type": "string",
                                  "enum": [
                                    "clip",
                                    "video",
                                    "brand_fact"
                                  ]
                                },
                                "id": {
                                  "type": "string"
                                }
                              },
                              "required": [
                                "type",
                                "id"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Once succeeded: what to read next — the clip made, the video the run wrote, or the brand kit fact the confirm confirmed (read it with brand_kit.read). Null until then."
                        },
                        "error_code": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Once failed: a stable code for why. Null otherwise."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "completed_at",
                        "created_at",
                        "error_code",
                        "job_id",
                        "result",
                        "started_at",
                        "status",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/jobs.set_webhook": {
      "post": {
        "operationId": "call_jobs_set_webhook",
        "summary": "Call jobs.set_webhook",
        "description": "'send my completed jobs to this URL', 'notify our server when a clip is done' — register the workspace's job-completion webhook, or replace it: the https URL to announce completed jobs to, and a signing secret the operator chose and keeps. Once set, every long-running job that finishes (a clip from videos.generate_clip, an edit or draft that answered in_flight) is announced once, as a POST signed with that secret whose body is the job's jobs.read answer. The secret is never shown back. It spends nothing and starts no job. Not for reading a job's status — that is jobs.read.\n\nEvery 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.",
        "tags": [
          "jobs"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2048,
                    "description": "The https URL to announce completed jobs to. It must name a public host on the default port, with no user name, password or fragment."
                  },
                  "signing_secret": {
                    "type": "string",
                    "pattern": "^[\\x21-\\x7e]{32,256}$",
                    "description": "A secret you choose and keep, 32 to 256 printable characters with no spaces. Every delivery is signed with it: x-goosy-signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of \"<t>.<body>\">. It is never shown back."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "url",
                  "signing_secret"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "webhook_id": {
                          "type": "string",
                          "description": "The webhook's id."
                        },
                        "url": {
                          "type": "string",
                          "description": "The URL completed jobs are announced to."
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "registered",
                            "replaced"
                          ],
                          "description": "registered — this call created the workspace's webhook; replaced — it already existed, and its URL and secret are now these."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "url",
                        "webhook_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/jobs.remove_webhook": {
      "post": {
        "operationId": "call_jobs_remove_webhook",
        "summary": "Call jobs.remove_webhook",
        "description": "Remove this workspace's job-completion webhook — 'remove our job webhook', 'stop sending finished jobs to our server', 'that webhook URL is dead, take it off'. A workspace has at most one: the address its finished jobs (a made clip, an edit or draft that ran long) are announced to over the API. Removing it stops every announcement from then on and releases the signing secret it was set up with; this cannot be undone, and the only way back is to register a webhook again. It takes no arguments. Calling it raises the approval card, which names the host announcements stop going to, so call it on the ask. If the workspace has no webhook, the card says so and nothing changes. Not for setting up or replacing the webhook's URL or secret — that is `jobs.set_webhook`. 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.\n\nEvery 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.",
        "tags": [
          "jobs"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "removed",
                              "description": "removed — the webhook is gone and its signing secret released; no completed job is announced to it again."
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "webhook_id": {
                          "type": "string",
                          "description": "The removed webhook's id."
                        },
                        "url_host": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "The host completed jobs were announced to."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/images.describe": {
      "post": {
        "operationId": "call_images_describe",
        "summary": "Call images.describe",
        "description": "'what images are on this board', 'tell me more about this image' — without generation_id, list one board's images, newest first: each image's id, stored caption and status; with generation_id, read that one image's stored description in full. The board is named by id and must be this workspace's. A listing is one page: totalCount is the board's real size, hasMore means older images sit on later pages, and page is a direct index, so the oldest images are on page ceil(totalCount / pageSize). It changes nothing. Not for the workspace's saved photos, logo and product shots — that is `images.brand_elements`.\n\nEvery 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.",
        "tags": [
          "images"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "generation_id": {
                    "description": "The id of ONE image to describe in detail. OMIT to list this board's images (ids + prompts + captions) — call it that way FIRST whenever you need an image id for images.iterate / images.add_to_board.",
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "page": {
                    "description": "Listing page, a DIRECT INDEX (newest first, 8 per page) — page 1 is the newest and the OLDEST images are on page ceil(totalCount / pageSize), so jump straight to the page you want rather than walking one page at a time. The listing result says totalCount and hasMore. Ignored when generation_id is set.",
                    "anyOf": [
                      {
                        "type": "integer",
                        "minimum": 1
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "board": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The board to act on, by id — one of this workspace's boards (board.tree lists them)."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "board"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "boardId": {
                          "type": "string"
                        },
                        "page": {
                          "type": "integer",
                          "minimum": 1
                        },
                        "pageSize": {
                          "type": "integer",
                          "minimum": 1
                        },
                        "totalCount": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "hasMore": {
                          "type": "boolean"
                        },
                        "images": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "generationId": {
                                "type": "string"
                              },
                              "role": {
                                "type": "string"
                              },
                              "status": {
                                "type": "string"
                              },
                              "description": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "createdAt": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "generationId",
                              "role",
                              "status",
                              "description",
                              "createdAt"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "instruction": {
                          "type": "string",
                          "minLength": 1
                        },
                        "generationId": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string"
                        },
                        "description": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "describedAt": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "createdAt": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/images.brand_elements": {
      "post": {
        "operationId": "call_images_brand_elements",
        "summary": "Call images.brand_elements",
        "description": "'what photos of me do we have saved', 'which logos can an image use' — list this workspace's saved brand elements, newest first: photos of the owner ('person'), logos, product shots and other references, each with its id, role and name. Only elements whose upload has finished are listed. It changes nothing. Not for saved looks — that is `images.saved_styles`.\n\nEvery 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.",
        "tags": [
          "images"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "kind": {
                    "description": "Restrict the listing to one role: 'person' (the operator's own photos — what a request for their likeness resolves to), 'logo', 'product', or 'reference'. Omit to list every role.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "logo",
                          "person",
                          "product",
                          "reference"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "page": {
                    "description": "Listing page (newest first, 12 per page). The result says hasMore — request page+1 to continue.",
                    "anyOf": [
                      {
                        "type": "integer",
                        "minimum": 1
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "elements": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "role": {
                                "type": "string",
                                "enum": [
                                  "logo",
                                  "person",
                                  "product",
                                  "reference"
                                ]
                              },
                              "name": {
                                "type": "string"
                              },
                              "packLabel": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "id",
                              "role",
                              "name",
                              "packLabel"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "page": {
                          "type": "integer",
                          "minimum": 1
                        },
                        "pageSize": {
                          "type": "integer",
                          "minimum": 1
                        },
                        "hasMore": {
                          "type": "boolean"
                        },
                        "instruction": {
                          "type": "string",
                          "minLength": 1
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "elements",
                        "hasMore",
                        "instruction",
                        "page",
                        "pageSize",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/images.saved_styles": {
      "post": {
        "operationId": "call_images_saved_styles",
        "summary": "Call images.saved_styles",
        "description": "'what styles do we have saved', 'show me our saved looks' — list this workspace's saved image styles, newest first: each look's id, name, note, and whether its source image is finished and usable. It changes nothing. Not for photos of people, logos or products — that is `images.brand_elements`.\n\nEvery 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.",
        "tags": [
          "images"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "styles": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "name": {
                                "type": "string"
                              },
                              "note": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "usable": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "id",
                              "name",
                              "note",
                              "usable"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "instruction": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "instruction",
                        "styles",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/images.save_style": {
      "post": {
        "operationId": "call_images_save_style",
        "summary": "Call images.save_style",
        "description": "'save this look so we can use it again', 'turn this image into a saved style' — save one image's look as a named, reusable workspace style. The name is required; saving the same image twice changes nothing and the answer says it was already a style. Not for keeping the image itself in the Library — that is `images.save_to_library`.\n\nEvery 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.",
        "tags": [
          "images"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "generation_id": {
                    "type": "string",
                    "description": "The id of the image whose LOOK should be saved."
                  },
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "description": "What to call the style — REQUIRED, because this is how the operator picks it later. Use their words if they named it; otherwise propose a short descriptive name and say what you chose."
                  },
                  "note": {
                    "description": "Optional 'when to use this' note for the operator's own reference.",
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "board": {
                    "description": "Optional: the board this image is being saved from, by id — recorded as where it came from. Omit when there is none.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "generation_id",
                  "name"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "savedStyleId": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "alreadySaved": {
                          "type": "boolean"
                        },
                        "instruction": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "alreadySaved",
                        "instruction",
                        "name",
                        "savedStyleId",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/images.save_to_library": {
      "post": {
        "operationId": "call_images_save_to_library",
        "summary": "Call images.save_to_library",
        "description": "'keep this image in our library', 'save that one for later' — keep one image, named by its id, in the workspace Library so it can be found and reused from any board. Saving twice changes nothing; the answer says whether it was already kept. Not for saving the image's look as a reusable style — that is `images.save_style`.\n\nEvery 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.",
        "tags": [
          "images"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "generation_id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The id of the image to keep in the Library (images.describe lists a board's images with their ids)."
                  },
                  "name": {
                    "description": "Optional name for the saved image.",
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "board": {
                    "description": "Optional: the board this image is being saved from, by id — recorded as where it came from. Omit when there is none.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "generation_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "savedGenerationIds": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "alreadySavedGenerationIds": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "skippedGenerationIds": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "alreadySavedGenerationIds",
                        "savedGenerationIds",
                        "skippedGenerationIds",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/images.add_to_board": {
      "post": {
        "operationId": "call_images_add_to_board",
        "summary": "Call images.add_to_board",
        "description": "'add that image to this board', 'bring this picture over as a reference' — place one image already in this workspace on a board, named by id, as an output tile or as a reference for later runs. Adding it twice changes nothing. Not for keeping an image in the Library — that is `images.save_to_library`.\n\nEvery 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.",
        "tags": [
          "images"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "generation_id": {
                    "type": "string",
                    "description": "The id of the image to add to this board."
                  },
                  "role": {
                    "description": "How the image sits on the board: 'output' (default) or 'reference' (an input for later runs).",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "output",
                          "reference"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "board": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The board to act on, by id — one of this workspace's boards (board.tree lists them)."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "generation_id",
                  "board"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "attachedGenerationIds": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "skippedGenerationIds": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "role": {
                          "type": "string",
                          "enum": [
                            "output",
                            "reference"
                          ]
                        },
                        "boardId": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "attachedGenerationIds",
                        "boardId",
                        "role",
                        "skippedGenerationIds",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/automations.list": {
      "post": {
        "operationId": "call_automations_list",
        "summary": "Call automations.list",
        "description": "'what automations do we have?', 'is that automation still on?' — list this workspace's automations, the same rows its Automations board shows: each one's definition id, name, status (Running, Needs a look, Paused or Not scheduled), the project it lives in, its schedule in words, when it last ran and when it fires next, plus a count per status. It answers one page — as many automations as fit, in the board's order — and `counts` on every page covers every automation, not only the rows shown; when `next_cursor` comes back, call again with it as `cursor` for the rest, and `limit` asks for fewer. It changes nothing. Not for whether one automation's inbound webhook is set up — that is `automations.webhook_token_status`.\n\nEvery 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.",
        "tags": [
          "automations"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "limit": {
                    "description": "At most this many automations on the page. Omit it to get as many as fit in one answer.",
                    "type": "integer",
                    "minimum": 1
                  },
                  "cursor": {
                    "description": "Where to continue: pass the `next_cursor` from the previous page, with the same filters. Omit it for the first page.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 512
                  },
                  "name": {
                    "description": "Only the automations whose name contains this, ignoring case. Omit it to list them all.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "automations": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "definition_id": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "board_id": {
                                "type": "string"
                              },
                              "name": {
                                "type": "string"
                              },
                              "status": {
                                "type": "string"
                              },
                              "lives_in": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "schedule": {
                                "type": "string"
                              },
                              "last_run_at": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "next_fire_at": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "definition_id",
                              "board_id",
                              "name",
                              "status",
                              "lives_in",
                              "schedule",
                              "last_run_at",
                              "next_fire_at"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "counts": {
                          "type": "object",
                          "properties": {
                            "total": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "running": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "paused": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "needs_a_look": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "not_scheduled": {
                              "type": "integer",
                              "minimum": 0
                            }
                          },
                          "required": [
                            "total",
                            "running",
                            "paused",
                            "needs_a_look",
                            "not_scheduled"
                          ],
                          "additionalProperties": false
                        },
                        "next_cursor": {
                          "description": "Present when there is another page: pass it back as `cursor` to read it. Absent on the last page.",
                          "type": "string"
                        },
                        "next": {
                          "description": "What to call next to read, change or fix one of these automations.",
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "automations",
                        "counts",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/automations.webhook_token_status": {
      "post": {
        "operationId": "call_automations_webhook_token_status",
        "summary": "Call automations.webhook_token_status",
        "description": "'why isn't my webhook firing?', 'is the Zapier trigger set up?' — for one webhook-triggered automation in this workspace, named by its definition id (automations.list gives it), say whether its inbound token is set up, when it was issued or last rotated, and whether the automation is published, so the endpoint would accept a call. It never returns the token, and it changes nothing. Not for listing the automations — that is `automations.list`.\n\nEvery 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.",
        "tags": [
          "automations"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "definition_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The automation's definition id — the id in its webhook URL. Read it from automations.list or the board, never invent one."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "definition_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "definition_id": {
                          "type": "string"
                        },
                        "display_name": {
                          "type": "string"
                        },
                        "purpose": {
                          "type": "string"
                        },
                        "configured": {
                          "type": "boolean"
                        },
                        "minted_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "rotated_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "published": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "configured",
                        "definition_id",
                        "display_name",
                        "minted_at",
                        "published",
                        "purpose",
                        "rotated_at",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/brand_kit.read": {
      "post": {
        "operationId": "call_brand_kit_read",
        "summary": "Call brand_kit.read",
        "description": "'what's our one-liner?', 'which offer is running right now?', 'find the photo of Alex at the counter' — read this workspace's brand kit: who the brand is, what it offers, who it is for, how it sounds and looks, where it is, its video settings, and its pictures by label, kind and tag (never the files). Each fact says whether a member confirmed it or it is still a suggestion; a suggestion carries the fact_id and updated_at a member confirms on the brand page. A large kit comes back in part, with `omitted` naming the groups to read next by `group`. It changes nothing. Not for adding or correcting a fact — that is `brand_kit.suggest`.\n\nEvery 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.",
        "tags": [
          "brand_kit"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "group": {
                    "description": "Only this section of the kit. Omit for the whole kit; a long section comes back in part, and `omitted` names what to read next.",
                    "type": "string",
                    "enum": [
                      "identity",
                      "offer",
                      "audience",
                      "verbal",
                      "visual",
                      "reach",
                      "video"
                    ]
                  },
                  "kind": {
                    "description": "Only this kind of fact — every row of one list, by the `kind` a section of `sections` names. Use it to read the whole of a list `sections` says was shortened (`shown` below its count).",
                    "type": "string",
                    "minLength": 1
                  },
                  "cursor": {
                    "description": "The next page of the list read with `kind`: pass the `next_cursor` the last read returned, with the same `kind`. Omit it for the first page.",
                    "type": "string",
                    "minLength": 1
                  },
                  "library_query": {
                    "description": "A word to find pictures by — a label, a kind or a tag ('book cover', 'person', 'product').",
                    "type": "string",
                    "maxLength": 120
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "name": {
                          "type": "string"
                        },
                        "logo": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "label": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "source": {
                                  "type": "string"
                                },
                                "files": {
                                  "type": "array",
                                  "items": {
                                    "type": "string",
                                    "enum": [
                                      "original",
                                      "transparent",
                                      "light",
                                      "dark"
                                    ]
                                  }
                                },
                                "files_missing": {
                                  "type": "array",
                                  "items": {
                                    "type": "string",
                                    "enum": [
                                      "transparent",
                                      "light",
                                      "dark"
                                    ]
                                  }
                                },
                                "served_from": {
                                  "type": "string"
                                },
                                "state": {
                                  "type": "string",
                                  "const": "suggested"
                                },
                                "fact_id": {
                                  "type": "string"
                                },
                                "updated_at": {
                                  "type": "string"
                                },
                                "pending": {
                                  "type": "object",
                                  "properties": {
                                    "label": {
                                      "anyOf": [
                                        {
                                          "type": "string"
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    },
                                    "source": {
                                      "type": "string"
                                    },
                                    "files": {
                                      "type": "array",
                                      "items": {
                                        "type": "string",
                                        "enum": [
                                          "original",
                                          "transparent",
                                          "light",
                                          "dark"
                                        ]
                                      }
                                    },
                                    "files_missing": {
                                      "type": "array",
                                      "items": {
                                        "type": "string",
                                        "enum": [
                                          "transparent",
                                          "light",
                                          "dark"
                                        ]
                                      }
                                    },
                                    "served_from": {
                                      "type": "string"
                                    },
                                    "state": {
                                      "type": "string",
                                      "const": "suggested"
                                    },
                                    "fact_id": {
                                      "type": "string"
                                    },
                                    "updated_at": {
                                      "type": "string"
                                    }
                                  },
                                  "required": [
                                    "label",
                                    "source",
                                    "files",
                                    "fact_id",
                                    "updated_at"
                                  ],
                                  "additionalProperties": false
                                }
                              },
                              "required": [
                                "label",
                                "source",
                                "files",
                                "fact_id",
                                "updated_at"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "adherence": {
                          "type": "string",
                          "enum": [
                            "tight",
                            "balanced",
                            "loose"
                          ]
                        },
                        "sections": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "section": {
                                "type": "string"
                              },
                              "group": {
                                "type": "string",
                                "enum": [
                                  "identity",
                                  "offer",
                                  "audience",
                                  "verbal",
                                  "visual",
                                  "reach",
                                  "video"
                                ]
                              },
                              "state": {
                                "type": "string",
                                "enum": [
                                  "empty",
                                  "suggested",
                                  "confirmed",
                                  "mixed"
                                ]
                              },
                              "confirmed": {
                                "type": "integer"
                              },
                              "suggested": {
                                "type": "integer"
                              },
                              "suggested_from": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "kinds": {
                                "type": "array",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "kind": {
                                      "type": "string"
                                    },
                                    "name": {
                                      "type": "string"
                                    },
                                    "confirmed": {
                                      "type": "integer"
                                    },
                                    "suggested": {
                                      "type": "integer"
                                    },
                                    "shown": {
                                      "type": "integer"
                                    }
                                  },
                                  "required": [
                                    "kind",
                                    "name",
                                    "confirmed",
                                    "suggested"
                                  ],
                                  "additionalProperties": false
                                }
                              },
                              "pictures": {
                                "type": "object",
                                "propertyNames": {
                                  "type": "string"
                                },
                                "additionalProperties": {
                                  "type": "integer"
                                }
                              },
                              "files": {
                                "type": "object",
                                "propertyNames": {
                                  "type": "string"
                                },
                                "additionalProperties": {
                                  "type": "integer"
                                }
                              },
                              "empty": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              }
                            },
                            "required": [
                              "section",
                              "group",
                              "state",
                              "confirmed",
                              "suggested"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "facts": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "kind": {
                                "type": "string"
                              },
                              "label": {
                                "type": "string"
                              },
                              "text": {
                                "type": "string"
                              },
                              "state": {
                                "type": "string",
                                "enum": [
                                  "suggested",
                                  "confirmed"
                                ]
                              },
                              "item_key": {
                                "type": "string"
                              },
                              "fact_id": {
                                "type": "string"
                              },
                              "updated_at": {
                                "type": "string"
                              },
                              "source": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "kind",
                              "label",
                              "text",
                              "state",
                              "fact_id",
                              "updated_at"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "library": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "asset_id": {
                                "type": "string"
                              },
                              "label": {
                                "type": "string"
                              },
                              "kind": {
                                "type": "string"
                              },
                              "tags": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "confirmed": {
                                "type": "boolean"
                              },
                              "fact_id": {
                                "type": "string"
                              },
                              "updated_at": {
                                "type": "string"
                              },
                              "source": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "asset_id",
                              "label",
                              "kind",
                              "tags",
                              "confirmed",
                              "fact_id",
                              "updated_at"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "fill": {
                          "type": "object",
                          "properties": {
                            "present": {
                              "type": "integer"
                            },
                            "total": {
                              "type": "integer"
                            },
                            "to_look_over": {
                              "type": "integer"
                            }
                          },
                          "required": [
                            "present",
                            "total",
                            "to_look_over"
                          ],
                          "additionalProperties": false
                        },
                        "page": {
                          "type": "object",
                          "properties": {
                            "kind": {
                              "type": "string"
                            },
                            "from": {
                              "type": "integer"
                            },
                            "shown": {
                              "type": "integer"
                            },
                            "total": {
                              "type": "integer"
                            },
                            "last": {
                              "type": "boolean"
                            }
                          },
                          "required": [
                            "kind",
                            "from",
                            "shown",
                            "total",
                            "last"
                          ],
                          "additionalProperties": false
                        },
                        "next_cursor": {
                          "type": "string"
                        },
                        "omitted": {
                          "type": "object",
                          "properties": {
                            "facts": {
                              "type": "integer"
                            },
                            "pictures": {
                              "type": "integer"
                            },
                            "groups": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            },
                            "kinds": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "kind": {
                                    "type": "string"
                                  },
                                  "unread": {
                                    "type": "integer"
                                  }
                                },
                                "required": [
                                  "kind",
                                  "unread"
                                ],
                                "additionalProperties": false
                              }
                            }
                          },
                          "required": [
                            "facts",
                            "pictures",
                            "groups"
                          ],
                          "additionalProperties": false
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "adherence",
                        "facts",
                        "fill",
                        "library",
                        "name",
                        "sections",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/brand_kit.suggest": {
      "post": {
        "operationId": "call_brand_kit_suggest",
        "summary": "Call brand_kit.suggest",
        "description": "'we're running a Harvest Week sale, 1 to 7 October', 'add our new shop on Alder Street' — add one fact to this workspace's brand kit as a SUGGESTION: a location, an offer, a person, a picture and its name, a contact detail, a product. `kind` is the kit's own name for the fact (read the kit first when unsure); a kind the kit holds many of takes an `item_key`. It never confirms anything and never overwrites a confirmed fact: a change waits beside it until a member confirms it on the brand page. The same suggestion twice changes nothing. A dated note (kind `timing`) is refused with `brand_kit.note_chat_only`: a member says it in chat, and the API has no speaker to own it. Not for how closely drafts follow the brand — that is `brand_kit.set_adherence`.\n\nEvery 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.",
        "tags": [
          "brand_kit"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "kind": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80,
                    "description": "The fact's kind, as the kit's catalogue names it, such as `location`, `offer`, `person` or `asset` — an open set the catalogue holds, not a fixed list."
                  },
                  "item_key": {
                    "description": "For a kind the kit holds many of: a short slug for this one.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120
                  },
                  "scope": {
                    "description": "For a video setting that differs per job: the job (`youtube`, `shorts`).",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 60
                  },
                  "value": {
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {},
                    "description": "The fact's value, in its kind's shape."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "kind",
                  "value"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "fact_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "suggested",
                            "confirmed"
                          ]
                        },
                        "line": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "fact_id",
                        "line",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/brand_kit.set_adherence": {
      "post": {
        "operationId": "call_brand_kit_set_adherence",
        "summary": "Call brand_kit.set_adherence",
        "description": "'keep the brand loose for this post', 'stick to our brand exactly from now on' — set how closely drafts follow this workspace's brand kit: tight (exactly), balanced (mostly) or loose (as a reference), for one piece named by its title, or as the brand's default for every draft that follows. It answers in two calls: without confirmation_id it proposes and says what would change; the same call again with that confirmation_id, on a member's own API key, applies exactly that. The brand's facts and banned words hold at every level. Not for changing what the kit says — that is `brand_kit.suggest`.\n\nEvery 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.",
        "tags": [
          "brand_kit"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "level": {
                    "type": "string",
                    "enum": [
                      "tight",
                      "balanced",
                      "loose"
                    ],
                    "description": "tight = stick to the brand exactly; balanced = mostly; loose = use it as a reference only (the facts still hold)."
                  },
                  "target": {
                    "type": "string",
                    "enum": [
                      "turn",
                      "piece",
                      "kit"
                    ],
                    "description": "turn = what the member just said about THIS piece in chat; piece = the piece's own setting; kit = the brand's default for everything."
                  },
                  "piece_title": {
                    "description": "For turn and piece, when no piece is open in this conversation: the piece's title, in the member's words.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "confirmation_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "level",
                  "target"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "applied"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "level": {
                          "type": "string",
                          "enum": [
                            "tight",
                            "balanced",
                            "loose"
                          ]
                        },
                        "target": {
                          "type": "string",
                          "enum": [
                            "turn",
                            "piece",
                            "kit"
                          ]
                        },
                        "piece_title": {
                          "type": "string"
                        },
                        "current_level": {
                          "type": "string",
                          "enum": [
                            "tight",
                            "balanced",
                            "loose"
                          ]
                        },
                        "line": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "level",
                        "state",
                        "target",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/brand_playbook.run": {
      "post": {
        "operationId": "call_brand_playbook_run",
        "summary": "Call brand_playbook.run",
        "description": "'make us a logo', 'make the icon set from our logo', 'make some poses of Alex' — run one of this workspace's brand playbooks: poses of one of the brand's people, a logo pack (a logo with its favicon and icon set), or the icon set from the logo the brand has. It answers in two calls: without confirmation_id it returns the price per stage and a confirmation_id and spends nothing; the same call again with that confirmation_id, on a member's own API key, starts the run, spends the quoted credits and answers its job_run_id. The logo pack pauses after drawing its directions: a call without confirmation_id then answers `awaiting_pick`, and choosing one (`pick`) takes the same two calls and spends nothing. Not for a single picture or an edit to one — that is `images.generate`.\n\nEvery 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.",
        "tags": [
          "brand_playbook"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "key": {
                    "type": "string",
                    "enum": [
                      "pose_pack",
                      "logo_pack",
                      "icon_set"
                    ]
                  },
                  "inputs": {
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {}
                  },
                  "pick": {
                    "type": "object",
                    "properties": {
                      "job_run_id": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                      },
                      "direction": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 60
                      }
                    },
                    "required": [
                      "job_run_id",
                      "direction"
                    ],
                    "additionalProperties": false
                  },
                  "confirmation_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "key"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/videos.forget_video_learning": {
      "post": {
        "operationId": "call_videos_forget_video_learning",
        "summary": "Call videos.forget_video_learning",
        "description": "'forget that we like short cold opens', 'that's not right any more' — forget one line Goosy has learned about the key holder's videos, quoted word for word with its category exactly as the brand kit's video page shows it; a paraphrase matches nothing. It answers in two calls: without confirmation_id it finds the line and says what would be forgotten, changing nothing; the same call again with that confirmation_id, on a member's own API key, forgets exactly that line. Not for a look they no longer want on a video — that is `videos.change_look`.\n\nEvery 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.",
        "tags": [
          "videos"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "category": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80,
                    "description": "The learned line's category, exactly as the page shows it beside the line."
                  },
                  "text": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000,
                    "description": "The learned line ITSELF, quoted word for word from what the page shows. It is matched exactly — a paraphrase matches nothing and removes nothing. If you are not certain of the wording, ask which line they mean instead of guessing."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "category",
                  "text"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "forgotten"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "category": {
                          "type": "string"
                        },
                        "text": {
                          "type": "string"
                        },
                        "sentence": {
                          "type": "string",
                          "description": "The line as the brand kit shows it."
                        },
                        "learned_on": {
                          "type": "string",
                          "description": "The day it was learned, YYYY-MM-DD."
                        },
                        "removed": {
                          "type": "boolean"
                        },
                        "href": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/videos.undo_edit": {
      "post": {
        "operationId": "call_videos_undo_edit",
        "summary": "Call videos.undo_edit",
        "description": "'undo that last change', 'put the pause back' — take back ONE thing the edit did to a video, by the log line's id `videos.read_edit` gives it. The line stays in the log, struck, and the video's length is worked out again; nothing is laid down again, so a master already made keeps the change until the video is edited again. It answers in two calls: without confirmation_id it names the line it would take back and changes nothing; the same call again with that confirmation_id, on a member's own API key, takes back exactly that line. Not for editing the video again — that is `videos.plan_edit`.\n\nEvery 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.",
        "tags": [
          "videos"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "video_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The video's id, as given in this conversation."
                  },
                  "log_entry_id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The log line to undo, by the id the edit log gave it."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "video_id",
                  "log_entry_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "undone"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "video_id": {
                          "type": "string"
                        },
                        "log_entry_id": {
                          "type": "string"
                        },
                        "line": {
                          "type": "string",
                          "description": "The edit line that would be taken back."
                        },
                        "undone": {
                          "type": "string"
                        },
                        "log": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "The log line's id — what `videos.undo_edit` takes."
                              },
                              "sentence": {
                                "type": "string",
                                "description": "The plain past-tense sentence a person reads under the player."
                              },
                              "kind": {
                                "type": "string",
                                "enum": [
                                  "hook_tightened",
                                  "pause_dropped",
                                  "captions_on",
                                  "insert_placed",
                                  "music_bed_laid",
                                  "scene_shortened",
                                  "transition_changed",
                                  "frame_moved",
                                  "put_on_screen",
                                  "hook_moved",
                                  "ending_looped",
                                  "graded",
                                  "fillers_cut",
                                  "retakes_cut",
                                  "studio_sound_on",
                                  "words_cut",
                                  "take_not_heard"
                                ]
                              },
                              "scene_id": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "minLength": 1,
                                    "description": "The scene's id, as given in the storyboard."
                                  },
                                  {
                                    "type": "null"
                                  }
                                ],
                                "description": "The scene's id, as given in the storyboard."
                              },
                              "undoable": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "id",
                              "sentence",
                              "kind",
                              "scene_id",
                              "undoable"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "seconds": {
                          "type": "integer"
                        },
                        "clock": {
                          "type": "string"
                        },
                        "relaying": {
                          "type": "boolean"
                        },
                        "open_at": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "video_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/videos.stock_pull": {
      "post": {
        "operationId": "call_videos_stock_pull",
        "summary": "Call videos.stock_pull",
        "description": "'find a real shot for this scene', 'use a real clip of a desk here' — find a real-world shot for one storyboard scene and drop it in as an insert of a few seconds; it never replaces the scene, and the answer names who took it with a link. It answers in two calls: without confirmation_id it says what would be looked for and for how long, and searches nothing; the same call again with that confirmation_id, on a member's own API key, searches, keeps the shot in this workspace's clips and places it. Not for a made clip when nothing real will do — that is `videos.generate_clip`.\n\nEvery 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.",
        "tags": [
          "videos"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "video_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The video's id, as given in this conversation."
                  },
                  "scene_id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The scene's id, as given in the storyboard."
                  },
                  "looking_for": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "What the shot should be of, in a few words."
                  },
                  "seconds": {
                    "default": 5,
                    "description": "How long the shot runs inside the scene — a few seconds.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 15
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "video_id",
                  "scene_id",
                  "looking_for"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "placed"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "video_id": {
                          "type": "string"
                        },
                        "scene_id": {
                          "type": "string"
                        },
                        "looking_for": {
                          "type": "string",
                          "description": "What the search would look for."
                        },
                        "seconds": {
                          "anyOf": [
                            {
                              "type": "integer",
                              "description": "How long the insert would run."
                            },
                            {
                              "type": "integer"
                            }
                          ]
                        },
                        "attribution": {
                          "type": "string",
                          "description": "The photographer's name."
                        },
                        "link": {
                          "type": "string",
                          "description": "The link to the shot on Pexels."
                        },
                        "marker": {
                          "type": "string"
                        },
                        "open_at": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "scene_id",
                        "seconds",
                        "state",
                        "video_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/images.batch": {
      "post": {
        "operationId": "call_images_batch",
        "summary": "Call images.batch",
        "description": "'give me ten options for the launch hero', 'make a batch of product shots on this board' — make a batch of new images from one brief onto a board in this workspace, named by id. It spends: it answers in two calls on every key. Without confirmation_id it checks the board, returns the quote (how many images, at what shape, and the draw on the workspace's image allowance) with a confirmation_id, and makes and charges nothing; the same call again with that confirmation_id, on a member's own API key, starts the run and answers its run_id. Each delivered image is charged when it is made. Not for a single image — that is `images.generate`.\n\nEvery 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.",
        "tags": [
          "images"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The board to act on, by id — one of this workspace's boards (board.tree lists them)."
                  },
                  "brief": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000,
                    "description": "What to generate, in plain words."
                  },
                  "count": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 10,
                    "description": "How many images the batch makes, 1-10. Each delivered image draws on the workspace's image allowance."
                  },
                  "shape": {
                    "description": "The aspect ratio. Omit for square (1:1).",
                    "type": "string",
                    "enum": [
                      "1:1",
                      "3:4",
                      "4:3",
                      "9:16",
                      "16:9"
                    ]
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "board",
                  "brief",
                  "count"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "enum": [
                                "dispatched",
                                "accepted"
                              ],
                              "description": "dispatched — the run is under way. accepted — the run is under way but its details could not be read just now: count and aspect_ratio are null; follow it by run_id."
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "quote": {
                          "type": "object",
                          "properties": {
                            "count": {
                              "type": "integer",
                              "exclusiveMinimum": 0
                            },
                            "aspect_ratio": {
                              "type": "string"
                            },
                            "board_id": {
                              "type": "string"
                            },
                            "budget": {
                              "type": "string",
                              "description": "The workspace allowance this batch draws on."
                            },
                            "budget_units": {
                              "type": "integer",
                              "exclusiveMinimum": 0,
                              "description": "How much of that allowance the batch draws."
                            }
                          },
                          "required": [
                            "count",
                            "aspect_ratio",
                            "board_id",
                            "budget",
                            "budget_units"
                          ],
                          "description": "What confirming would run: how many images, at what shape, on which board, and the draw on the workspace's image allowance. Each delivered image is charged when it is made.",
                          "additionalProperties": false
                        },
                        "run_id": {
                          "type": "string",
                          "description": "The run now under way — follow it by this."
                        },
                        "count": {
                          "anyOf": [
                            {
                              "type": "integer"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "aspect_ratio": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/images.start_board": {
      "post": {
        "operationId": "call_images_start_board",
        "summary": "Call images.start_board",
        "description": "'start a new image board for the launch thumbnails', 'open a board for our October post images' — open a NEW image board in this workspace under the given name, with the opening request waiting in its composer, UNSENT. One call: it answers the new board's id and name and `open_path` — the link that lands a member on the board with the request ready. Nothing is generated and nothing is spent: pictures are made only when a member presses send. Not for making images on a board that already exists — that is `images.generate` or `images.batch`.\n\nEvery 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.",
        "tags": [
          "images"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "description": "What to call the board, in the operator's own words — what the pictures are FOR (\"Launch thumbnails\", \"October post images\"), never a generic placeholder."
                  },
                  "opening_request": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000,
                    "description": "The request to leave waiting in the board's composer: what to make, how many, and at what shape, written as the operator would say it. Build it from what they actually told you — never invent a brief they did not describe."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "name",
                  "opening_request"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "board_name": {
                          "type": "string"
                        },
                        "request_waiting": {
                          "type": "boolean",
                          "const": true,
                          "description": "Always true: the opening request waits, unsent, in the board's composer — nothing is generated until a member sends it."
                        },
                        "open_path": {
                          "type": "string",
                          "description": "The board's path in the app, carrying the opening request: whoever opens it lands on the board with the request waiting, unsent, in its composer."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "board_id",
                        "board_name",
                        "open_path",
                        "request_waiting",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/automations.deactivate": {
      "post": {
        "operationId": "call_automations_deactivate",
        "summary": "Call automations.deactivate",
        "description": "'turn this automation off', 'stop that automation running' — switch one automation in this workspace off, named by its board_id: it stops running until it is switched back on, and its saved versions are kept, so switching it on again restores exactly what it ran. It answers in two calls: without confirmation_id it proposes, says what would change and changes nothing; the same call again with that confirmation_id, on a member's own API key, switches it off. Not for pausing only its schedule — that is `automations.pause_schedule`.\n\nEvery 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.",
        "tags": [
          "automations"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "description": "The board of the automation. Omit on an automation board — the conversation already knows which one it is on.",
                    "type": "string"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "deactivated"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "display_name": {
                          "type": "string"
                        },
                        "is_active": {
                          "type": "boolean"
                        },
                        "active_version": {
                          "anyOf": [
                            {
                              "type": "integer",
                              "exclusiveMinimum": 0
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "changed": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "board_id",
                        "display_name",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/automations.pause_schedule": {
      "post": {
        "operationId": "call_automations_pause_schedule",
        "summary": "Call automations.pause_schedule",
        "description": "'pause this automation's schedule', 'stop it running on schedule for now' — stop one automation in this workspace, named by its board_id, from running on its schedule, without switching the automation off. It answers in two calls: without confirmation_id it proposes, shows the schedule as it stands and changes nothing; the same call again with that confirmation_id, on a member's own API key, pauses it. Not for switching the whole automation off — that is `automations.deactivate`.\n\nEvery 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.",
        "tags": [
          "automations"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "description": "The board of the automation. Omit on an automation board — the conversation already knows which one it is on.",
                    "type": "string"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "paused"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "display_name": {
                          "type": "string"
                        },
                        "cron": {
                          "type": "string"
                        },
                        "timezone": {
                          "type": "string"
                        },
                        "current_status": {
                          "type": "string",
                          "enum": [
                            "active",
                            "paused"
                          ]
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "active",
                            "paused"
                          ]
                        },
                        "changed": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "board_id",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/automations.resume_schedule": {
      "post": {
        "operationId": "call_automations_resume_schedule",
        "summary": "Call automations.resume_schedule",
        "description": "'resume this automation's schedule', 'start it running on schedule again' — let one paused automation in this workspace, named by its board_id, run on its schedule again, on the times it was saved with. It answers in two calls: without confirmation_id it proposes, shows the schedule as it stands and changes nothing; the same call again with that confirmation_id, on a member's own API key, resumes it. Not for switching an automation on — that is `automations.activate`.\n\nEvery 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.",
        "tags": [
          "automations"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "description": "The board of the automation. Omit on an automation board — the conversation already knows which one it is on.",
                    "type": "string"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "resumed"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "display_name": {
                          "type": "string"
                        },
                        "cron": {
                          "type": "string"
                        },
                        "timezone": {
                          "type": "string"
                        },
                        "current_status": {
                          "type": "string",
                          "enum": [
                            "active",
                            "paused"
                          ]
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "active",
                            "paused"
                          ]
                        },
                        "changed": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "board_id",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/automations.restore_version": {
      "post": {
        "operationId": "call_automations_restore_version",
        "summary": "Call automations.restore_version",
        "description": "'put version 2 back', 'restore the version from last week' — make an earlier published version of one automation in this workspace, named by its board_id, the one that runs again: its document is published forward as a NEW version, so the history stays in order. It answers in two calls: without confirmation_id it proposes, names the version it would replace and changes nothing; the same call again with that confirmation_id, on a member's own API key, restores it. Not for switching an automation on — that is `automations.activate`.\n\nEvery 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.",
        "tags": [
          "automations"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "version": {
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "description": "The version number to put back — the number shown in the automation's Versions list."
                  },
                  "board_id": {
                    "description": "The board of the automation. Omit on an automation board — the conversation already knows which one it is on.",
                    "type": "string"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "version"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "restored"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "display_name": {
                          "type": "string"
                        },
                        "restore_from_version": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "active_version": {
                          "anyOf": [
                            {
                              "anyOf": [
                                {
                                  "type": "integer",
                                  "exclusiveMinimum": 0
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            {
                              "type": "integer",
                              "exclusiveMinimum": 0
                            }
                          ]
                        },
                        "restored_from_version": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "active_version",
                        "board_id",
                        "display_name",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/automations.test_run": {
      "post": {
        "operationId": "call_automations_test_run",
        "summary": "Call automations.test_run",
        "description": "'test this automation', 'dry-run it before we switch it on' — dry-run one automation in this workspace, named by its board_id, against the workspace's synthetic test contact: its draft (or, with no draft, the version that runs) walks every step, sends go only to the workspace's designated test address, waits are skipped and CRM writes are withheld. A person or deal the member names is the test to run: the synthetic test contact stands in for them, and the answer's subject says so. The run starts with the trigger data a real start carries for that contact; sample carries only trigger details the member gave (a form's fields, say), as test values. A run uses model and step time. It answers in two calls: without confirmation_id it proposes, names the version and the test address and runs nothing; the same call again with that confirmation_id, on a member's own API key, runs it. Not for switching it on for real contacts — that is `automations.activate`.\n\nEvery 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.",
        "tags": [
          "automations"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "description": "The id of the automation to test, as `automations.list` answers it — never its name. Omit it to test the automation this conversation is on; for another automation the operator names, read its board_id from `automations.list` and pass that.",
                    "type": "string"
                  },
                  "sample": {
                    "description": "Sample trigger data, shaped as a real trigger of this automation would carry it — for a form capture, `{ event: { payload: { fields: { form: \"application\" } } } }`. Pass it only with trigger details the operator gave (a form they named, say), as test values; a plain test passes none. Any person in it is replaced by the synthetic test contact, which stands in for them. A JSON object, at most 16 KB.",
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {}
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "tested"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "tested": {
                          "type": "string",
                          "enum": [
                            "draft",
                            "active"
                          ]
                        },
                        "version": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "inbox": {
                          "type": "string"
                        },
                        "run_id": {
                          "type": "string"
                        },
                        "subject": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "pending"
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "inbox",
                        "state",
                        "tested",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/automations.repair_step": {
      "post": {
        "operationId": "call_automations_repair_step",
        "summary": "Call automations.repair_step",
        "description": "'why did the email step fail?', 'fix the step that broke on the last run' — repair ONE step of an automation in this workspace, named by its board_id, that failed on its last run. Without a fix it reads how that step failed and how it is configured today, and changes nothing; omit step_key to repair the step that failed on the last run, which the answer names. With a fix it answers in two calls: without confirmation_id it proposes the change and shows that one step before and after, changing nothing; the same call again with that confirmation_id, on a member's own API key, saves it as a new draft that does not run until it is switched on. A fix that would touch any other step, the order or what starts the automation is refused. Not for rewriting the whole automation — that is `automations.author`.\n\nEvery 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.",
        "tags": [
          "automations"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "description": "The board of the automation to repair. Omit on an automation board — the conversation already knows which one it is on.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 64
                  },
                  "step_key": {
                    "description": "The machine key of the step that FAILED. Leave it out to repair the step that failed on the last run; the answer names that step. Call without `fix` first to read what it was given, what it produced and how it failed.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 64
                  },
                  "fix": {
                    "description": "The change to THAT ONE step. Omit on the first call. A field you leave out is left exactly as it is. You may not change the step's key, its kind, what it hands on, any other step, the order, or what starts the automation — a fix that would is REFUSED.",
                    "type": "object",
                    "properties": {
                      "label": {
                        "description": "A new name for the step.",
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 80
                      },
                      "description": {
                        "description": "A new plain-language description of the step.",
                        "type": "string",
                        "maxLength": 400
                      },
                      "implementation": {
                        "description": "The registered action this step should run instead, e.g. `ghl.send_email`.",
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 200
                      },
                      "params": {
                        "description": "The step's settings, in full. What you send REPLACES the step's current settings, so include the ones that were already right. An `email.send` step's saved email is set by its `emailId`, never by the email's words.",
                        "type": "object",
                        "propertyNames": {
                          "type": "string"
                        },
                        "additionalProperties": {}
                      },
                      "delay": {
                        "type": "object",
                        "properties": {
                          "duration": {
                            "type": "object",
                            "properties": {
                              "days": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "hours": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "minutes": {
                                "type": "integer",
                                "minimum": 0
                              }
                            },
                            "additionalProperties": false
                          },
                          "until": {
                            "anyOf": [
                              {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 2000
                              },
                              {
                                "type": "object",
                                "properties": {
                                  "path": {
                                    "type": "string"
                                  },
                                  "offset": {
                                    "type": "string"
                                  }
                                },
                                "required": [
                                  "path",
                                  "offset"
                                ],
                                "additionalProperties": false
                              }
                            ]
                          },
                          "timezone": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 64
                          }
                        },
                        "additionalProperties": false
                      },
                      "waitForEvent": {
                        "type": "object",
                        "properties": {
                          "event": {
                            "type": "string",
                            "enum": [
                              "tag_added",
                              "reply_received"
                            ]
                          },
                          "tag": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 200
                          },
                          "timeoutMinutes": {
                            "type": "integer",
                            "minimum": 5,
                            "maximum": 43200
                          }
                        },
                        "required": [
                          "event",
                          "timeoutMinutes"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "additionalProperties": false
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "diagnosis"
                            },
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "repaired"
                            }
                          ]
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "step_key": {
                          "type": "string"
                        },
                        "step_label": {
                          "type": "string"
                        },
                        "error_message": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "step": {
                          "type": "object",
                          "properties": {
                            "key": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 64,
                              "pattern": "^[a-z][a-z0-9_]*$",
                              "description": "A stable key: lowercase letters, digits and underscores, starting with a letter (gather_answers); later steps read its answer as steps.<key>."
                            },
                            "label": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 80,
                              "description": "The step's name in plain language."
                            },
                            "kind": {
                              "default": "automated",
                              "description": "What the step is. automated (the default, leave it off): runs an action by its implementation. ask: stops for a person or the contact, then carries on with the answer. wait: waits a set time, until a date, for something to happen, until a read says done, or for a callback. think: a model answers its instruction from the inputs it names, in the shape its JSON Schema declares. run: starts another automation of this workspace, and may wait for its answer. branch: sends the run down one of its edges by its rules. set: gives later steps the fields it names. loop: runs its body once for each item of a list, or until a test holds. code: JavaScript or Python, written when the step is set up with `automations.bind_step`. Every kind but automated and ask takes no implementation.",
                              "type": "string",
                              "enum": [
                                "automated",
                                "approval",
                                "code_step",
                                "delay",
                                "conversation",
                                "wait_for_event",
                                "compute",
                                "think",
                                "ask",
                                "loop",
                                "branch",
                                "set",
                                "wait",
                                "run",
                                "code"
                              ]
                            },
                            "description": {
                              "description": "What this step does, in one sentence.",
                              "type": "string",
                              "maxLength": 400
                            },
                            "implementation": {
                              "description": "An automated step's action, by its catalogue key: contact.add_tag, contact.remove_tag, email.send, notify.member, opportunity.move_stage, contact.update_field, data.query, data.write, automation.call, or a connected tool's connector.<app>.<tool>; an ask step's is automation.ask. An unknown key is refused by name and nothing is saved, so never invent one.",
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 200
                            },
                            "params": {
                              "description": "The step's settings, in its action's own shape: { \"tag\": \"hot\" } for contact.add_tag, { \"emailId\": \"<a saved email's id>\" } for email.send. Every action refuses a setting it does not take and names it, so ask the member rather than guessing one, and never pass settings without an implementation except on the kinds that take none. An ask step takes { \"target\": { \"kind\": \"member\" } or { \"kind\": \"role\", \"role\": \"admin\" } or { \"kind\": \"contact\" }, \"question\": \"…\", \"answerKind\": \"approve_decline\" or \"choice\" or \"text\", \"options\": [\"…\"], \"timeout\": \"P3D\" }: the timeout is required (ask the member for it), options only for choice, and a contact answers in text. Its answer is steps.<key>.outcome: approved, declined, answered or timed_out. A think step takes { \"instruction\": \"…\", \"inputs\": { \"<name>\": \"{{ steps.<key>.<field> }}\" }, \"schema\": <a JSON Schema> }: the schema is the answer's shape ({ \"type\": \"string\", \"enum\": [\"yes\", \"no\"] } for a decision; an object naming every field later steps read), and later steps read it at steps.<key>.answer. It reads the run only through its inputs, and may name a \"slot\": \"writing.standard\", \"writing.plus\", \"writing.max\" (the strongest writing last). To answer once for each item of a list, add \"items\": \"{{ steps.<key>.<list> }}\" (at most 20) and read each as {{ item }} in the inputs; the answers are steps.<key>.items[i].answer. When the work is many items and nobody waits on the answer (a nightly summary, sorting a list of replies), add \"timing\": \"batch\" and say so: the items go to the provider's batch rate, about half the usual price where the step's model has one, and the answers come back within hours rather than seconds. A wait step takes one of: { \"for\": \"P2D\" } (how long, an ISO 8601 duration, at most 90 days); { \"until\": \"2026-11-01T09:00\" } (a date-time in the workspace's zone, or one {{ … }} that gives an instant); { \"event\": { \"type\": \"tag_added\", \"tag\": \"…\" } or { \"type\": \"reply_received\" }, \"timeout\": \"P3D\" } (until that happens to the run's contact, at most 30 days); { \"poll\": { \"tool\": \"automation.call\" or \"connector.<app>.<tool>\", \"params\": { … }, \"until\": \"{{ json.status == 'done' }}\", \"every\": \"PT5M\" }, \"timeout\": \"PT1H\" }; or { \"callback\": { \"request\": { … }, \"expect\": <a JSON Schema> }, \"timeout\": \"PT15M\" }. A wait that times out fails as wait_timeout, and the step's on_error decides what happens next. A run step takes { \"workflow\": \"<an automation id in this workspace>\", \"mode\": \"wait\" or \"start\", \"input\": { … } }: wait holds this run until that one answers, read at steps.<key>.<field>; start sets it going and carries on. A set step's settings are the fields it gives later steps ({ \"total\": \"{{ … }}\", \"label\": \"…\" }), read at steps.<key>.<field>. A branch step takes { \"rules\": [ { \"name\": \"big_order\", \"if\": \"{{ trigger.payload.total > 500 }}\" } ], \"mode\": \"first\" } and no implementation: each edge out of it names the rule it follows in output, or \"else\" for the edge taken when no rule holds; mode \"all\" takes every rule that holds. A code step takes { \"language\": \"javascript\" or \"python\", \"instruction\": \"<what the code does>\", \"inputs\": { \"<name>\": \"{{ … }}\" }, \"output_schema\": <a JSON Schema> }; binding it writes the code, which reads only its inputs and has no network. A browser step reads a website on this workspace's browsing list: `implementation: \"platform.browser\"` with `{\"task\":\"…\",\"startUrl\":\"https://…\",\"output\":<a JSON Schema>,\"maxMinutes\":5}` (`output` when later steps read fields; up to 10 minutes). Its answer is at `stepResults.<key>.answer`. When `stepResults.<key>.outcome` is `needs_member` (a CAPTCHA, a sign-in code, a missing login, or a site off the list), follow it with an `ask` to the member quoting `stepResults.<key>.member_step`, then the same browser step again. Any setting, at any depth, reads the run's data with {{ … }} around one CEL expression. A value that is exactly one {{ … }} keeps its type (a number, a list, a map); with words around it, it is text. What an expression reads: trigger (what started the run: a webhook's body at trigger.payload.<field>, an app event's fields at trigger.event.payload.<field>); steps.<key> (an earlier step's answer: a table read's rows at steps.<key>.rows, each { row_id, values: { <column>: … } }; a think's at steps.<key>.answer); json (the step just before); item and index (inside a loop); run.id and run.contactId; contact.consent.email and contact.consent.sms. Operators: + - * / %, == != < <= > >=, && || !, cond ? a : b, x in list. Functions, each called by its bare name: size(x). For text: upper(s), lower(s), trim(s), replace(s, from, to), substring(s, start, end), split(s, sep), join(list, sep), s.contains(t), s.startsWith(t), test(s, re2), extract(s, re2), format(\"%s of %s\", [a, b]). For numbers: round(x), round(x, 2), floor(x), ceil(x), abs(x), sum(list), avg(list), min(list), max(list), int(x), double(x), string(x). For lists: list.map(x, expr), list.filter(x, cond), list.exists(x, cond), first(list), last(list), sort(list), sortBy(list, \"field\"), unique(list), slice(list, from, to). For maps: has(m.field), get(m, \"a.b\", default), pick(m, keys), merge(a, b), keys(m), values(m). For dates: now(), dateAdd(d, \"P1D\"), dateDiff(a, b, \"day\"), dateFormat(d, \"MMM d, h:mm a\", \"America/Chicago\") (yyyy MM dd HH mm, and a zone; UTC when none), startOf(d, \"week\"). A value that may be missing: coalesce(trigger.payload.nickname, \"friend\") gives a default, and coalesce(trigger.payload.company, omit) leaves that key out. Examples: \"Booking {{ trigger.payload.booking_id }} for {{ trigger.payload.guests }} guests\"; { \"open\": \"{{ size(steps.read_tasks.rows) }}\" }; \"{{ join(steps.read_tasks.rows.map(r, r.values.title), ', ') }}\". An expression that cannot be read, names a step that is not before this one, or gives the wrong kind of value is refused at save with its path and its fix.",
                              "type": "object",
                              "propertyNames": {
                                "type": "string"
                              },
                              "additionalProperties": {}
                            },
                            "delay": {
                              "type": "object",
                              "properties": {
                                "duration": {
                                  "type": "object",
                                  "properties": {
                                    "days": {
                                      "type": "integer",
                                      "minimum": 0
                                    },
                                    "hours": {
                                      "type": "integer",
                                      "minimum": 0
                                    },
                                    "minutes": {
                                      "type": "integer",
                                      "minimum": 0
                                    }
                                  },
                                  "additionalProperties": false
                                },
                                "until": {
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "minLength": 1,
                                      "maxLength": 2000
                                    },
                                    {
                                      "type": "object",
                                      "properties": {
                                        "path": {
                                          "type": "string"
                                        },
                                        "offset": {
                                          "type": "string"
                                        }
                                      },
                                      "required": [
                                        "path",
                                        "offset"
                                      ],
                                      "additionalProperties": false
                                    }
                                  ]
                                },
                                "timezone": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 64
                                }
                              },
                              "additionalProperties": false
                            },
                            "waitForEvent": {
                              "type": "object",
                              "properties": {
                                "event": {
                                  "type": "string",
                                  "enum": [
                                    "tag_added",
                                    "reply_received"
                                  ]
                                },
                                "tag": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 200
                                },
                                "timeoutMinutes": {
                                  "type": "integer",
                                  "minimum": 5,
                                  "maximum": 43200
                                }
                              },
                              "required": [
                                "event",
                                "timeoutMinutes"
                              ],
                              "additionalProperties": false
                            }
                          },
                          "required": [
                            "key",
                            "label"
                          ],
                          "additionalProperties": false
                        },
                        "run_id": {
                          "type": "string"
                        },
                        "test_run": {
                          "type": "boolean"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "applies_to_version": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "expected_latest_version": {
                          "anyOf": [
                            {
                              "type": "integer",
                              "exclusiveMinimum": 0
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "step_before": {
                          "type": "object",
                          "properties": {
                            "key": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 64,
                              "pattern": "^[a-z][a-z0-9_]*$",
                              "description": "A stable key: lowercase letters, digits and underscores, starting with a letter (gather_answers); later steps read its answer as steps.<key>."
                            },
                            "label": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 80,
                              "description": "The step's name in plain language."
                            },
                            "kind": {
                              "default": "automated",
                              "description": "What the step is. automated (the default, leave it off): runs an action by its implementation. ask: stops for a person or the contact, then carries on with the answer. wait: waits a set time, until a date, for something to happen, until a read says done, or for a callback. think: a model answers its instruction from the inputs it names, in the shape its JSON Schema declares. run: starts another automation of this workspace, and may wait for its answer. branch: sends the run down one of its edges by its rules. set: gives later steps the fields it names. loop: runs its body once for each item of a list, or until a test holds. code: JavaScript or Python, written when the step is set up with `automations.bind_step`. Every kind but automated and ask takes no implementation.",
                              "type": "string",
                              "enum": [
                                "automated",
                                "approval",
                                "code_step",
                                "delay",
                                "conversation",
                                "wait_for_event",
                                "compute",
                                "think",
                                "ask",
                                "loop",
                                "branch",
                                "set",
                                "wait",
                                "run",
                                "code"
                              ]
                            },
                            "description": {
                              "description": "What this step does, in one sentence.",
                              "type": "string",
                              "maxLength": 400
                            },
                            "implementation": {
                              "description": "An automated step's action, by its catalogue key: contact.add_tag, contact.remove_tag, email.send, notify.member, opportunity.move_stage, contact.update_field, data.query, data.write, automation.call, or a connected tool's connector.<app>.<tool>; an ask step's is automation.ask. An unknown key is refused by name and nothing is saved, so never invent one.",
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 200
                            },
                            "params": {
                              "description": "The step's settings, in its action's own shape: { \"tag\": \"hot\" } for contact.add_tag, { \"emailId\": \"<a saved email's id>\" } for email.send. Every action refuses a setting it does not take and names it, so ask the member rather than guessing one, and never pass settings without an implementation except on the kinds that take none. An ask step takes { \"target\": { \"kind\": \"member\" } or { \"kind\": \"role\", \"role\": \"admin\" } or { \"kind\": \"contact\" }, \"question\": \"…\", \"answerKind\": \"approve_decline\" or \"choice\" or \"text\", \"options\": [\"…\"], \"timeout\": \"P3D\" }: the timeout is required (ask the member for it), options only for choice, and a contact answers in text. Its answer is steps.<key>.outcome: approved, declined, answered or timed_out. A think step takes { \"instruction\": \"…\", \"inputs\": { \"<name>\": \"{{ steps.<key>.<field> }}\" }, \"schema\": <a JSON Schema> }: the schema is the answer's shape ({ \"type\": \"string\", \"enum\": [\"yes\", \"no\"] } for a decision; an object naming every field later steps read), and later steps read it at steps.<key>.answer. It reads the run only through its inputs, and may name a \"slot\": \"writing.standard\", \"writing.plus\", \"writing.max\" (the strongest writing last). To answer once for each item of a list, add \"items\": \"{{ steps.<key>.<list> }}\" (at most 20) and read each as {{ item }} in the inputs; the answers are steps.<key>.items[i].answer. When the work is many items and nobody waits on the answer (a nightly summary, sorting a list of replies), add \"timing\": \"batch\" and say so: the items go to the provider's batch rate, about half the usual price where the step's model has one, and the answers come back within hours rather than seconds. A wait step takes one of: { \"for\": \"P2D\" } (how long, an ISO 8601 duration, at most 90 days); { \"until\": \"2026-11-01T09:00\" } (a date-time in the workspace's zone, or one {{ … }} that gives an instant); { \"event\": { \"type\": \"tag_added\", \"tag\": \"…\" } or { \"type\": \"reply_received\" }, \"timeout\": \"P3D\" } (until that happens to the run's contact, at most 30 days); { \"poll\": { \"tool\": \"automation.call\" or \"connector.<app>.<tool>\", \"params\": { … }, \"until\": \"{{ json.status == 'done' }}\", \"every\": \"PT5M\" }, \"timeout\": \"PT1H\" }; or { \"callback\": { \"request\": { … }, \"expect\": <a JSON Schema> }, \"timeout\": \"PT15M\" }. A wait that times out fails as wait_timeout, and the step's on_error decides what happens next. A run step takes { \"workflow\": \"<an automation id in this workspace>\", \"mode\": \"wait\" or \"start\", \"input\": { … } }: wait holds this run until that one answers, read at steps.<key>.<field>; start sets it going and carries on. A set step's settings are the fields it gives later steps ({ \"total\": \"{{ … }}\", \"label\": \"…\" }), read at steps.<key>.<field>. A branch step takes { \"rules\": [ { \"name\": \"big_order\", \"if\": \"{{ trigger.payload.total > 500 }}\" } ], \"mode\": \"first\" } and no implementation: each edge out of it names the rule it follows in output, or \"else\" for the edge taken when no rule holds; mode \"all\" takes every rule that holds. A code step takes { \"language\": \"javascript\" or \"python\", \"instruction\": \"<what the code does>\", \"inputs\": { \"<name>\": \"{{ … }}\" }, \"output_schema\": <a JSON Schema> }; binding it writes the code, which reads only its inputs and has no network. A browser step reads a website on this workspace's browsing list: `implementation: \"platform.browser\"` with `{\"task\":\"…\",\"startUrl\":\"https://…\",\"output\":<a JSON Schema>,\"maxMinutes\":5}` (`output` when later steps read fields; up to 10 minutes). Its answer is at `stepResults.<key>.answer`. When `stepResults.<key>.outcome` is `needs_member` (a CAPTCHA, a sign-in code, a missing login, or a site off the list), follow it with an `ask` to the member quoting `stepResults.<key>.member_step`, then the same browser step again. Any setting, at any depth, reads the run's data with {{ … }} around one CEL expression. A value that is exactly one {{ … }} keeps its type (a number, a list, a map); with words around it, it is text. What an expression reads: trigger (what started the run: a webhook's body at trigger.payload.<field>, an app event's fields at trigger.event.payload.<field>); steps.<key> (an earlier step's answer: a table read's rows at steps.<key>.rows, each { row_id, values: { <column>: … } }; a think's at steps.<key>.answer); json (the step just before); item and index (inside a loop); run.id and run.contactId; contact.consent.email and contact.consent.sms. Operators: + - * / %, == != < <= > >=, && || !, cond ? a : b, x in list. Functions, each called by its bare name: size(x). For text: upper(s), lower(s), trim(s), replace(s, from, to), substring(s, start, end), split(s, sep), join(list, sep), s.contains(t), s.startsWith(t), test(s, re2), extract(s, re2), format(\"%s of %s\", [a, b]). For numbers: round(x), round(x, 2), floor(x), ceil(x), abs(x), sum(list), avg(list), min(list), max(list), int(x), double(x), string(x). For lists: list.map(x, expr), list.filter(x, cond), list.exists(x, cond), first(list), last(list), sort(list), sortBy(list, \"field\"), unique(list), slice(list, from, to). For maps: has(m.field), get(m, \"a.b\", default), pick(m, keys), merge(a, b), keys(m), values(m). For dates: now(), dateAdd(d, \"P1D\"), dateDiff(a, b, \"day\"), dateFormat(d, \"MMM d, h:mm a\", \"America/Chicago\") (yyyy MM dd HH mm, and a zone; UTC when none), startOf(d, \"week\"). A value that may be missing: coalesce(trigger.payload.nickname, \"friend\") gives a default, and coalesce(trigger.payload.company, omit) leaves that key out. Examples: \"Booking {{ trigger.payload.booking_id }} for {{ trigger.payload.guests }} guests\"; { \"open\": \"{{ size(steps.read_tasks.rows) }}\" }; \"{{ join(steps.read_tasks.rows.map(r, r.values.title), ', ') }}\". An expression that cannot be read, names a step that is not before this one, or gives the wrong kind of value is refused at save with its path and its fix.",
                              "type": "object",
                              "propertyNames": {
                                "type": "string"
                              },
                              "additionalProperties": {}
                            },
                            "delay": {
                              "type": "object",
                              "properties": {
                                "duration": {
                                  "type": "object",
                                  "properties": {
                                    "days": {
                                      "type": "integer",
                                      "minimum": 0
                                    },
                                    "hours": {
                                      "type": "integer",
                                      "minimum": 0
                                    },
                                    "minutes": {
                                      "type": "integer",
                                      "minimum": 0
                                    }
                                  },
                                  "additionalProperties": false
                                },
                                "until": {
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "minLength": 1,
                                      "maxLength": 2000
                                    },
                                    {
                                      "type": "object",
                                      "properties": {
                                        "path": {
                                          "type": "string"
                                        },
                                        "offset": {
                                          "type": "string"
                                        }
                                      },
                                      "required": [
                                        "path",
                                        "offset"
                                      ],
                                      "additionalProperties": false
                                    }
                                  ]
                                },
                                "timezone": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 64
                                }
                              },
                              "additionalProperties": false
                            },
                            "waitForEvent": {
                              "type": "object",
                              "properties": {
                                "event": {
                                  "type": "string",
                                  "enum": [
                                    "tag_added",
                                    "reply_received"
                                  ]
                                },
                                "tag": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 200
                                },
                                "timeoutMinutes": {
                                  "type": "integer",
                                  "minimum": 5,
                                  "maximum": 43200
                                }
                              },
                              "required": [
                                "event",
                                "timeoutMinutes"
                              ],
                              "additionalProperties": false
                            }
                          },
                          "required": [
                            "key",
                            "label"
                          ],
                          "additionalProperties": false
                        },
                        "step_after": {
                          "type": "object",
                          "properties": {
                            "key": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 64,
                              "pattern": "^[a-z][a-z0-9_]*$",
                              "description": "A stable key: lowercase letters, digits and underscores, starting with a letter (gather_answers); later steps read its answer as steps.<key>."
                            },
                            "label": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 80,
                              "description": "The step's name in plain language."
                            },
                            "kind": {
                              "default": "automated",
                              "description": "What the step is. automated (the default, leave it off): runs an action by its implementation. ask: stops for a person or the contact, then carries on with the answer. wait: waits a set time, until a date, for something to happen, until a read says done, or for a callback. think: a model answers its instruction from the inputs it names, in the shape its JSON Schema declares. run: starts another automation of this workspace, and may wait for its answer. branch: sends the run down one of its edges by its rules. set: gives later steps the fields it names. loop: runs its body once for each item of a list, or until a test holds. code: JavaScript or Python, written when the step is set up with `automations.bind_step`. Every kind but automated and ask takes no implementation.",
                              "type": "string",
                              "enum": [
                                "automated",
                                "approval",
                                "code_step",
                                "delay",
                                "conversation",
                                "wait_for_event",
                                "compute",
                                "think",
                                "ask",
                                "loop",
                                "branch",
                                "set",
                                "wait",
                                "run",
                                "code"
                              ]
                            },
                            "description": {
                              "description": "What this step does, in one sentence.",
                              "type": "string",
                              "maxLength": 400
                            },
                            "implementation": {
                              "description": "An automated step's action, by its catalogue key: contact.add_tag, contact.remove_tag, email.send, notify.member, opportunity.move_stage, contact.update_field, data.query, data.write, automation.call, or a connected tool's connector.<app>.<tool>; an ask step's is automation.ask. An unknown key is refused by name and nothing is saved, so never invent one.",
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 200
                            },
                            "params": {
                              "description": "The step's settings, in its action's own shape: { \"tag\": \"hot\" } for contact.add_tag, { \"emailId\": \"<a saved email's id>\" } for email.send. Every action refuses a setting it does not take and names it, so ask the member rather than guessing one, and never pass settings without an implementation except on the kinds that take none. An ask step takes { \"target\": { \"kind\": \"member\" } or { \"kind\": \"role\", \"role\": \"admin\" } or { \"kind\": \"contact\" }, \"question\": \"…\", \"answerKind\": \"approve_decline\" or \"choice\" or \"text\", \"options\": [\"…\"], \"timeout\": \"P3D\" }: the timeout is required (ask the member for it), options only for choice, and a contact answers in text. Its answer is steps.<key>.outcome: approved, declined, answered or timed_out. A think step takes { \"instruction\": \"…\", \"inputs\": { \"<name>\": \"{{ steps.<key>.<field> }}\" }, \"schema\": <a JSON Schema> }: the schema is the answer's shape ({ \"type\": \"string\", \"enum\": [\"yes\", \"no\"] } for a decision; an object naming every field later steps read), and later steps read it at steps.<key>.answer. It reads the run only through its inputs, and may name a \"slot\": \"writing.standard\", \"writing.plus\", \"writing.max\" (the strongest writing last). To answer once for each item of a list, add \"items\": \"{{ steps.<key>.<list> }}\" (at most 20) and read each as {{ item }} in the inputs; the answers are steps.<key>.items[i].answer. When the work is many items and nobody waits on the answer (a nightly summary, sorting a list of replies), add \"timing\": \"batch\" and say so: the items go to the provider's batch rate, about half the usual price where the step's model has one, and the answers come back within hours rather than seconds. A wait step takes one of: { \"for\": \"P2D\" } (how long, an ISO 8601 duration, at most 90 days); { \"until\": \"2026-11-01T09:00\" } (a date-time in the workspace's zone, or one {{ … }} that gives an instant); { \"event\": { \"type\": \"tag_added\", \"tag\": \"…\" } or { \"type\": \"reply_received\" }, \"timeout\": \"P3D\" } (until that happens to the run's contact, at most 30 days); { \"poll\": { \"tool\": \"automation.call\" or \"connector.<app>.<tool>\", \"params\": { … }, \"until\": \"{{ json.status == 'done' }}\", \"every\": \"PT5M\" }, \"timeout\": \"PT1H\" }; or { \"callback\": { \"request\": { … }, \"expect\": <a JSON Schema> }, \"timeout\": \"PT15M\" }. A wait that times out fails as wait_timeout, and the step's on_error decides what happens next. A run step takes { \"workflow\": \"<an automation id in this workspace>\", \"mode\": \"wait\" or \"start\", \"input\": { … } }: wait holds this run until that one answers, read at steps.<key>.<field>; start sets it going and carries on. A set step's settings are the fields it gives later steps ({ \"total\": \"{{ … }}\", \"label\": \"…\" }), read at steps.<key>.<field>. A branch step takes { \"rules\": [ { \"name\": \"big_order\", \"if\": \"{{ trigger.payload.total > 500 }}\" } ], \"mode\": \"first\" } and no implementation: each edge out of it names the rule it follows in output, or \"else\" for the edge taken when no rule holds; mode \"all\" takes every rule that holds. A code step takes { \"language\": \"javascript\" or \"python\", \"instruction\": \"<what the code does>\", \"inputs\": { \"<name>\": \"{{ … }}\" }, \"output_schema\": <a JSON Schema> }; binding it writes the code, which reads only its inputs and has no network. A browser step reads a website on this workspace's browsing list: `implementation: \"platform.browser\"` with `{\"task\":\"…\",\"startUrl\":\"https://…\",\"output\":<a JSON Schema>,\"maxMinutes\":5}` (`output` when later steps read fields; up to 10 minutes). Its answer is at `stepResults.<key>.answer`. When `stepResults.<key>.outcome` is `needs_member` (a CAPTCHA, a sign-in code, a missing login, or a site off the list), follow it with an `ask` to the member quoting `stepResults.<key>.member_step`, then the same browser step again. Any setting, at any depth, reads the run's data with {{ … }} around one CEL expression. A value that is exactly one {{ … }} keeps its type (a number, a list, a map); with words around it, it is text. What an expression reads: trigger (what started the run: a webhook's body at trigger.payload.<field>, an app event's fields at trigger.event.payload.<field>); steps.<key> (an earlier step's answer: a table read's rows at steps.<key>.rows, each { row_id, values: { <column>: … } }; a think's at steps.<key>.answer); json (the step just before); item and index (inside a loop); run.id and run.contactId; contact.consent.email and contact.consent.sms. Operators: + - * / %, == != < <= > >=, && || !, cond ? a : b, x in list. Functions, each called by its bare name: size(x). For text: upper(s), lower(s), trim(s), replace(s, from, to), substring(s, start, end), split(s, sep), join(list, sep), s.contains(t), s.startsWith(t), test(s, re2), extract(s, re2), format(\"%s of %s\", [a, b]). For numbers: round(x), round(x, 2), floor(x), ceil(x), abs(x), sum(list), avg(list), min(list), max(list), int(x), double(x), string(x). For lists: list.map(x, expr), list.filter(x, cond), list.exists(x, cond), first(list), last(list), sort(list), sortBy(list, \"field\"), unique(list), slice(list, from, to). For maps: has(m.field), get(m, \"a.b\", default), pick(m, keys), merge(a, b), keys(m), values(m). For dates: now(), dateAdd(d, \"P1D\"), dateDiff(a, b, \"day\"), dateFormat(d, \"MMM d, h:mm a\", \"America/Chicago\") (yyyy MM dd HH mm, and a zone; UTC when none), startOf(d, \"week\"). A value that may be missing: coalesce(trigger.payload.nickname, \"friend\") gives a default, and coalesce(trigger.payload.company, omit) leaves that key out. Examples: \"Booking {{ trigger.payload.booking_id }} for {{ trigger.payload.guests }} guests\"; { \"open\": \"{{ size(steps.read_tasks.rows) }}\" }; \"{{ join(steps.read_tasks.rows.map(r, r.values.title), ', ') }}\". An expression that cannot be read, names a step that is not before this one, or gives the wrong kind of value is refused at save with its path and its fix.",
                              "type": "object",
                              "propertyNames": {
                                "type": "string"
                              },
                              "additionalProperties": {}
                            },
                            "delay": {
                              "type": "object",
                              "properties": {
                                "duration": {
                                  "type": "object",
                                  "properties": {
                                    "days": {
                                      "type": "integer",
                                      "minimum": 0
                                    },
                                    "hours": {
                                      "type": "integer",
                                      "minimum": 0
                                    },
                                    "minutes": {
                                      "type": "integer",
                                      "minimum": 0
                                    }
                                  },
                                  "additionalProperties": false
                                },
                                "until": {
                                  "anyOf": [
                                    {
                                      "type": "string",
                                      "minLength": 1,
                                      "maxLength": 2000
                                    },
                                    {
                                      "type": "object",
                                      "properties": {
                                        "path": {
                                          "type": "string"
                                        },
                                        "offset": {
                                          "type": "string"
                                        }
                                      },
                                      "required": [
                                        "path",
                                        "offset"
                                      ],
                                      "additionalProperties": false
                                    }
                                  ]
                                },
                                "timezone": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 64
                                }
                              },
                              "additionalProperties": false
                            },
                            "waitForEvent": {
                              "type": "object",
                              "properties": {
                                "event": {
                                  "type": "string",
                                  "enum": [
                                    "tag_added",
                                    "reply_received"
                                  ]
                                },
                                "tag": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 200
                                },
                                "timeoutMinutes": {
                                  "type": "integer",
                                  "minimum": 5,
                                  "maximum": 43200
                                }
                              },
                              "required": [
                                "event",
                                "timeoutMinutes"
                              ],
                              "additionalProperties": false
                            }
                          },
                          "required": [
                            "key",
                            "label"
                          ],
                          "additionalProperties": false
                        },
                        "version": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "board_id",
                        "state",
                        "step_key",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/automations.propose_webhook_token": {
      "post": {
        "operationId": "call_automations_propose_webhook_token",
        "summary": "Call automations.propose_webhook_token",
        "description": "'rotate that webhook token', 'give me a new token for the Zapier trigger' — replace the inbound webhook token of one webhook-triggered automation in this workspace, named by its definition_id (automations.list gives it). It answers in two calls: without confirmation_id it proposes, says whether a token exists and whether the automation is live, and changes nothing; the same call again with that confirmation_id, on a member's own API key, rotates it and returns the new token ONCE, in that answer — store it then, nothing can show it again, and every sender on the old token is refused from that moment. Needs an account admin's key. With intent `mint` it issues an automation's FIRST token the same way. Not for shutting a webhook off — that is `automations.revoke_webhook_token`.\n\nEvery 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.",
        "tags": [
          "automations"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "definition_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The automation's definition id — the id in its webhook URL. Read it from automations.list or the board, never invent one."
                  },
                  "intent": {
                    "type": "string",
                    "enum": [
                      "mint",
                      "rotate"
                    ],
                    "description": "`mint` for an automation that has no token yet; `rotate` to replace a live one (every existing sender stops working the moment it is rotated)."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "definition_id",
                  "intent"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "enum": [
                                "minted",
                                "rotated"
                              ]
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "intent": {
                          "type": "string",
                          "enum": [
                            "mint",
                            "rotate"
                          ]
                        },
                        "status": {
                          "type": "object",
                          "properties": {
                            "definition_id": {
                              "type": "string"
                            },
                            "display_name": {
                              "type": "string"
                            },
                            "purpose": {
                              "type": "string"
                            },
                            "configured": {
                              "type": "boolean"
                            },
                            "minted_at": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "rotated_at": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "published": {
                              "type": "boolean"
                            }
                          },
                          "required": [
                            "definition_id",
                            "display_name",
                            "purpose",
                            "configured",
                            "minted_at",
                            "rotated_at",
                            "published"
                          ],
                          "description": "Whether this automation's inbound webhook token is provisioned, and when it was last issued. Never contains the token itself — nothing can return that after the moment it is minted.",
                          "additionalProperties": false
                        },
                        "webhook_token": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "status",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/automations.revoke_webhook_token": {
      "post": {
        "operationId": "call_automations_revoke_webhook_token",
        "summary": "Call automations.revoke_webhook_token",
        "description": "'kill that webhook', 'that token leaked, revoke it' — retire the inbound webhook token of one webhook-triggered automation in this workspace, named by its definition_id (automations.list gives it): every caller using it is refused from then on and the automation stops firing until a new token is issued. It answers in two calls — a proposal that names which automation goes dark and whether it is live, then a confirm on a member's own API key. Not for replacing the token — that is `automations.propose_webhook_token`.\n\nEvery 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.",
        "tags": [
          "automations"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "definition_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The automation's definition id — the id in its webhook URL. Read it from automations.list or the board, never invent one."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "definition_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "revoked"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "status": {
                          "type": "object",
                          "properties": {
                            "definition_id": {
                              "type": "string"
                            },
                            "display_name": {
                              "type": "string"
                            },
                            "purpose": {
                              "type": "string"
                            },
                            "configured": {
                              "type": "boolean"
                            },
                            "minted_at": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "rotated_at": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "published": {
                              "type": "boolean"
                            }
                          },
                          "required": [
                            "definition_id",
                            "display_name",
                            "purpose",
                            "configured",
                            "minted_at",
                            "rotated_at",
                            "published"
                          ],
                          "description": "Whether this automation's inbound webhook token is provisioned, and when it was last issued. Never contains the token itself — nothing can return that after the moment it is minted.",
                          "additionalProperties": false
                        },
                        "definition_id": {
                          "type": "string"
                        },
                        "display_name": {
                          "type": "string"
                        },
                        "purpose": {
                          "type": "string"
                        },
                        "configured": {
                          "type": "boolean"
                        },
                        "minted_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "rotated_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "published": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/automations.run": {
      "post": {
        "operationId": "call_automations_run",
        "summary": "Call automations.run",
        "description": "'run the welcome automation now', 'kick off the onboarding automation for this lead' — start a live run of one switched-on automation in this workspace, named by its board_id (automations.list gives each one): the same run its board's Run now starts, on the version that is live, so its sends and actions are real. It answers at once with the run id and pending; the run continues in the background and the automation's board shows how it went. Pass input to give the run its opening values, and a request_id of your own so a retried call answers the first run instead of starting a second. A draft or a switched-off automation is refused and nothing runs. Each run uses model and step time and is billed as a run. Not for trying a draft safely against the workspace's test contact — that is `automations.test_run`.\n\nEvery 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.",
        "tags": [
          "automations"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The automation's board id, as `automations.list` returns it in board_id."
                  },
                  "input": {
                    "description": "Optional values the run starts with, as one JSON object of at most 16 KB; its steps read them from the run's state. The run's own identity (tenant, workspace, user, run id) is set by the platform and cannot be supplied here.",
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {}
                  },
                  "request_id": {
                    "description": "Optional UUID you choose for this start. Sending the same request_id again answers the first call's run and starts nothing new, so a retried call never runs the automation twice. Omit it and every call starts its own run.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "board_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "run_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                          "description": "The run that was started; the automation's board shows it in its run history."
                        },
                        "board_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "status": {
                          "type": "string",
                          "const": "pending",
                          "description": "Always pending: the run was handed to the runner and has not run yet."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "board_id",
                        "run_id",
                        "status",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/automations.get": {
      "post": {
        "operationId": "call_automations_get",
        "summary": "Call automations.get",
        "description": "'show me the steps of the welcome automation', 'what does the onboarding automation do right now?' — read one automation in this workspace, named by its board_id (automations.list gives each one), with the steps, edges and trigger of the version it runs: the switched-on version, or its newest draft when none is switched on. The steps come back exactly as stored, in the shape `automations.author` takes, and latest_version says whether a newer draft exists. It changes nothing. An automation of another workspace, or a board with no automation, answers not found. Not for listing every automation and its status — that is `automations.list`.\n\nEvery 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.",
        "tags": [
          "automations"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The automation's board id, as `automations.list` returns it in board_id."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "board_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "board_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "definition_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                          "description": "The automation's definition id, as `automations.list` returns it."
                        },
                        "name": {
                          "type": "string",
                          "description": "The automation's name."
                        },
                        "version": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "number": {
                                  "type": "integer",
                                  "exclusiveMinimum": 0,
                                  "description": "The version number, as the automation's versions list shows it."
                                },
                                "is_live": {
                                  "type": "boolean",
                                  "description": "True when this is the switched-on version; false when the automation has none switched on and this is its newest draft."
                                },
                                "status": {
                                  "type": "string",
                                  "description": "The version's stored status."
                                },
                                "steps": {
                                  "description": "The version's steps, exactly as stored: the same document `automations.author` takes in steps."
                                },
                                "edges": {
                                  "description": "The version's edges as stored, or null when the steps run in their listed order."
                                },
                                "trigger": {
                                  "description": "What starts the automation, as stored, or null when no trigger is set."
                                },
                                "review_gated": {
                                  "type": "boolean",
                                  "description": "True when each run waits for a person's review before it acts."
                                },
                                "created_at": {
                                  "type": "string",
                                  "description": "When this version was saved (ISO 8601)."
                                }
                              },
                              "required": [
                                "number",
                                "is_live",
                                "status",
                                "steps",
                                "edges",
                                "trigger",
                                "review_gated",
                                "created_at"
                              ],
                              "description": "One stored version of the automation.",
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "The switched-on version, else the newest draft; null when the automation has no version saved yet."
                        },
                        "latest_version": {
                          "anyOf": [
                            {
                              "type": "integer",
                              "exclusiveMinimum": 0
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "The newest version number, draft or live; when it is above version.number a newer draft exists. Null when no version is saved."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "board_id",
                        "definition_id",
                        "latest_version",
                        "name",
                        "version",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/automations.undo_draft": {
      "post": {
        "operationId": "call_automations_undo_draft",
        "summary": "Call automations.undo_draft",
        "description": "'undo the last change to the welcome automation', 'take back that edit' — undo the last change to one automation's draft in this workspace, named by its key: the draft's previous state is written back as a new change, so `automations.redo_draft` can bring the undone change back, and the version that runs is unchanged. Pass `revision` (a save's answer) to undo exactly that change: a draft that moved since is refused and nothing changes. A retry with the same idempotency_key returns the first answer and undoes nothing more. Not for throwing the whole draft away — that is `automations.discard_draft`.\n\nEvery 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.",
        "tags": [
          "automations"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "description": "The board of the automation. Omit on an automation board — the conversation already knows which one it is on.",
                    "type": "string"
                  },
                  "revision": {
                    "description": "Only to undo one particular change: the `revision` that change's save answered. A draft that moved since is refused, and nothing changes; leave it out to step from the draft as it stands.",
                    "type": "integer",
                    "minimum": 0
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "display_name": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string",
                          "const": "draft"
                        },
                        "revision": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "can_undo": {
                          "type": "boolean"
                        },
                        "can_redo": {
                          "type": "boolean"
                        },
                        "replayed": {
                          "type": "boolean",
                          "description": "True when this is the first result of an earlier call with the same idempotency_key, returned without stepping the draft again."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "board_id",
                        "can_redo",
                        "can_undo",
                        "display_name",
                        "replayed",
                        "revision",
                        "status",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/automations.redo_draft": {
      "post": {
        "operationId": "call_automations_redo_draft",
        "summary": "Call automations.redo_draft",
        "description": "'redo that change', 'put the edit I undid back' — redo the change last undone on one automation's draft in this workspace, named by its key: it is written back into the draft as a new change, and the version that runs is unchanged. A fresh edit after an undo clears what can be redone. A retry with the same idempotency_key returns the first answer and redoes nothing more. Not for undoing a change — that is `automations.undo_draft`.\n\nEvery 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.",
        "tags": [
          "automations"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "description": "The board of the automation. Omit on an automation board — the conversation already knows which one it is on.",
                    "type": "string"
                  },
                  "revision": {
                    "description": "Only to undo one particular change: the `revision` that change's save answered. A draft that moved since is refused, and nothing changes; leave it out to step from the draft as it stands.",
                    "type": "integer",
                    "minimum": 0
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "display_name": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string",
                          "const": "draft"
                        },
                        "revision": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "can_undo": {
                          "type": "boolean"
                        },
                        "can_redo": {
                          "type": "boolean"
                        },
                        "replayed": {
                          "type": "boolean",
                          "description": "True when this is the first result of an earlier call with the same idempotency_key, returned without stepping the draft again."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "board_id",
                        "can_redo",
                        "can_undo",
                        "display_name",
                        "replayed",
                        "revision",
                        "status",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/automations.discard_draft": {
      "post": {
        "operationId": "call_automations_discard_draft",
        "summary": "Call automations.discard_draft",
        "description": "'discard the draft of the welcome automation', 'scrap these changes and keep what is running' — throw away one automation's unpublished draft in this workspace, named by its key: every change in it goes at once, and the automation shows its live version again; the live version and its runs are not touched. An automation that was never published has no live version to go back to, and is refused. It answers in two calls: without confirmation_id it proposes, says what would be thrown away and changes nothing; the same call again with that confirmation_id, on a member's own API key, discards it, refused if the draft changed since. Not for undoing one change — that is `automations.undo_draft`.\n\nEvery 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.",
        "tags": [
          "automations"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "description": "The board of the automation. Omit on an automation board — the conversation already knows which one it is on.",
                    "type": "string"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "discarded"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "display_name": {
                          "type": "string"
                        },
                        "discarded_version": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "live_version": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/brand_kit.confirm": {
      "post": {
        "operationId": "call_brand_kit_confirm",
        "summary": "Call brand_kit.confirm",
        "description": "'yes, that address is right — confirm it', 'confirm the Harvest Week offer' — confirm ONE suggested fact in this workspace's brand kit exactly as a member was shown it: the fact's id and the updated_at `brand_kit.read` returned; it takes no value. It answers in two calls: without confirmation_id it proposes and shows the fact as it would be confirmed; the same call again with that confirmation_id, on a member's own API key, starts the confirm and answers its job_run_id — the confirm runs on its own, in seconds. A suggestion that changed since it was read is refused. Not for changing a fact — that is `brand_kit.suggest` with the corrected value, then a confirm of that new version.\n\nEvery 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.",
        "tags": [
          "brand_kit"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "fact_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The suggested fact to confirm — its id from brand_kit.read."
                  },
                  "expected_updated_at": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The fact's updated_at from brand_kit.read — the version the member was shown."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "fact_id",
                  "expected_updated_at"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "submitted"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "fact_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "kind": {
                          "type": "string",
                          "description": "The kit's own name for the fact (location, offer, …)."
                        },
                        "item_key": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "value": {
                          "description": "The fact exactly as it would be confirmed — the value shown."
                        },
                        "expected_updated_at": {
                          "type": "string"
                        },
                        "job_run_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                          "description": "The confirm's job reference, for support. Its status is read by `job_id`, never by this id."
                        },
                        "job_id": {
                          "type": "string",
                          "description": "The confirm's handle. Read its status with `jobs.read` until it says succeeded or failed: queued or running — still pending, keep waiting; succeeded — confirmed; failed — refused, and error_code says why (brand_fact.changed_since_review: the fact changed after it was read)."
                        },
                        "read_outcome_with": {
                          "type": "object",
                          "properties": {
                            "tool": {
                              "type": "string",
                              "const": "brand_kit.read"
                            },
                            "kind": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "tool",
                            "kind"
                          ],
                          "description": "Where the confirmed fact reads once `jobs.read` on job_id says succeeded: `brand_kit.read` with this kind. It cannot tell a pending confirm from a refused one — the fact reads suggested in both — so the status is `jobs.read`'s.",
                          "additionalProperties": false
                        },
                        "line": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "fact_id",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/brand_kit.retire": {
      "post": {
        "operationId": "call_brand_kit_retire",
        "summary": "Call brand_kit.retire",
        "description": "'take the old Alder Street shop out of the kit', 'that offer is over, remove it', 'no, that is not our logo' — retire ONE fact of this workspace's brand kit, named by the fact_id `brand_kit.read` returned. A confirmed fact leaves the kit; a suggestion is declined, and the same suggestion is not brought back. It answers in two calls: without confirmation_id it shows the fact as it would be retired and returns a confirmation_id; the same call again with that confirmation_id retires exactly that fact. It works only on a member's own API key. A retired fact cannot be restored; it is added again as a new fact. Not for correcting a fact — that is `brand_kit.suggest` with the corrected value.\n\nEvery 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.",
        "tags": [
          "brand_kit"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "fact_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The fact's id, exactly as brand_kit.read returned it."
                  },
                  "expected_updated_at": {
                    "description": "The updated_at brand_kit.read returned with the fact. A fact that changed since is refused. Omit to retire it as it reads now.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 64
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "fact_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "retired"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "fact_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "kind": {
                          "anyOf": [
                            {
                              "type": "string",
                              "description": "The kit's own name for the fact."
                            },
                            {
                              "type": "string"
                            }
                          ]
                        },
                        "item_key": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "fact_state": {
                          "type": "string",
                          "enum": [
                            "confirmed",
                            "suggested"
                          ],
                          "description": "confirmed: retiring removes it from the kit. suggested: retiring declines it, and the same suggestion is not brought back."
                        },
                        "value": {
                          "description": "The fact exactly as it would be retired."
                        },
                        "updated_at": {
                          "type": "string"
                        },
                        "declined": {
                          "type": "boolean",
                          "description": "true when the retired fact was a suggestion, now declined."
                        },
                        "read_outcome_with": {
                          "type": "object",
                          "properties": {
                            "tool": {
                              "type": "string",
                              "const": "brand_kit.read"
                            },
                            "kind": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "tool",
                            "kind"
                          ],
                          "description": "`brand_kit.read` with this kind no longer lists the fact.",
                          "additionalProperties": false
                        },
                        "line": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "fact_id",
                        "item_key",
                        "kind",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/brand_kit.upload_asset": {
      "post": {
        "operationId": "call_brand_kit_upload_asset",
        "summary": "Call brand_kit.upload_asset",
        "description": "'upload our new logo', 'add this photo of Alex to the brand', 'put our menu PDF in the brand library' — bring one file of the member's own into this workspace's brand library, as the brand page's upload does: a logo, a picture of one of the brand's people, a document, or a reference picture. It takes three steps: action start with the kind, file name, type and exact size returns an asset_id and a short-lived put_url; PUT the file's bytes to put_url; action complete with that asset_id checks the stored file against the kind's type and size limits and puts it in the library, where it reads confirmed within seconds. A logo is also suggested as the brand's logo, and its light and dark versions are made at no charge. It works only on a member's own API key, and it spends no credits. Not for a fact that is not a file — that is `brand_kit.suggest`.\n\nEvery 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.",
        "tags": [
          "brand_kit"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "action": {
                    "type": "string",
                    "enum": [
                      "start",
                      "complete"
                    ]
                  },
                  "kind": {
                    "type": "string",
                    "enum": [
                      "logo",
                      "person_picture",
                      "document",
                      "reference"
                    ]
                  },
                  "filename": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 255
                  },
                  "mime_type": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 160
                  },
                  "byte_size": {
                    "type": "integer",
                    "exclusiveMinimum": 0
                  },
                  "label": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 240
                  },
                  "person": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120
                  },
                  "asset_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "action"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "action": {
                          "type": "string",
                          "enum": [
                            "start",
                            "complete"
                          ]
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "open",
                            "landed"
                          ],
                          "description": "open: send the bytes, then complete. landed: the file is in the library."
                        },
                        "asset_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "kind": {
                          "type": "string",
                          "enum": [
                            "logo",
                            "person_picture",
                            "document",
                            "reference"
                          ]
                        },
                        "put_url": {
                          "description": "start: where to PUT the file's bytes, with the content-type in put_headers. It is the caller's own short-lived upload address.",
                          "type": "string"
                        },
                        "put_headers": {
                          "type": "object",
                          "propertyNames": {
                            "type": "string"
                          },
                          "additionalProperties": {
                            "type": "string"
                          }
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "fact_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "job_run_id": {
                          "description": "complete: the confirm's job reference, for support. The file reads confirmed in seconds; read it as read_outcome_with says.",
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "read_outcome_with": {
                          "type": "object",
                          "properties": {
                            "tool": {
                              "type": "string",
                              "const": "brand_kit.read"
                            },
                            "kind": {
                              "type": "string",
                              "const": "asset"
                            }
                          },
                          "required": [
                            "tool",
                            "kind"
                          ],
                          "description": "`brand_kit.read` with kind \"asset\" shows the outcome.",
                          "additionalProperties": false
                        },
                        "line": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "action",
                        "asset_id",
                        "kind",
                        "line",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/keys.rotate": {
      "post": {
        "operationId": "call_keys_rotate",
        "summary": "Call keys.rotate",
        "description": "Propose, then confirm, replacing the API key making this call with a new one — 'rotate this key', 'swap in a fresh credential'. The current key keeps working for overlap_hours after the new key exists, then stops. The new key comes back once, on the confirm, so store it before anything else. Not for any other key — revoke or rotate those in Settings › API & MCP.",
        "tags": [
          "keys"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "overlap_hours": {
                    "description": "How many hours the current key keeps working after the new one exists, 0 to 168. Default 24.",
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 168
                  },
                  "confirmation_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` whenever the call did not succeed, including when the tool itself returned a typed `ok: false` — this tool runs at account level, so there is no workspace boundary to distinguish. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "rotated"
                          ]
                        },
                        "overlap_hours": {
                          "type": "integer"
                        },
                        "previous_key_prefix": {
                          "type": "string"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "key": {
                          "type": "string"
                        },
                        "key_prefix": {
                          "type": "string"
                        },
                        "key_expires_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "previous_key_expires_at": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "ok",
                        "overlap_hours",
                        "previous_key_prefix",
                        "state"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/leads.capture": {
      "post": {
        "operationId": "call_leads_capture",
        "summary": "Call leads.capture",
        "description": "Send one lead from a form on the workspace's own website into Goosy — 'send this signup in as a lead', 'capture the demo request from our site', 'add the waitlist entry for jane@example.com'. The lead is stored, the submitter becomes the workspace's contact, the automations that start on a captured lead run, and the contact goes to the workspace's connected GoHighLevel; with no CRM connected the lead waits and is sent when one is connected. It answers with the lead's and the contact's ids, a submission_id, and any fields it ignored. To retry a call, send the same submission_id so nothing is stored twice. Not for a note on someone already a contact — that is `contact.note`. The contact's details reach the connected CRM and an automation may message them; this cannot be undone from here.\n\nEvery 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.",
        "tags": [
          "leads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "description": "The submitter's email address. Required; the contact is matched on it."
                  },
                  "name": {
                    "description": "The submitter's name, as they typed it.",
                    "type": "string",
                    "maxLength": 200
                  },
                  "phone": {
                    "description": "The submitter's phone number; sent to the CRM in international form when it can be read as one.",
                    "type": "string",
                    "maxLength": 64
                  },
                  "form": {
                    "description": "Your name for the form on your site (lowercase letters, digits, - or _), e.g. newsletter or demo_request. An automation can start only on leads from one form.",
                    "type": "string",
                    "maxLength": 64
                  },
                  "fields": {
                    "description": "Every other field the form collected, by its own name, as strings. Stored with the lead as sent.",
                    "type": "object",
                    "propertyNames": {
                      "type": "string",
                      "maxLength": 100
                    },
                    "additionalProperties": {
                      "type": "string",
                      "maxLength": 4000
                    }
                  },
                  "utm": {
                    "description": "The visit's first-touch campaign tags and click ids, when your site kept them, by their URL names: utm_source, utm_medium, utm_campaign, utm_term, utm_content, fbclid, gclid, li_fat_id. Any other key is dropped and listed in ignored_fields.",
                    "type": "object",
                    "propertyNames": {
                      "type": "string",
                      "maxLength": 32
                    },
                    "additionalProperties": {
                      "type": "string",
                      "maxLength": 512
                    }
                  },
                  "consent": {
                    "description": "What the submitter agreed to, recorded with the lead as sent.",
                    "type": "object",
                    "properties": {
                      "email": {
                        "description": "The submitter agreed to email.",
                        "type": "boolean"
                      },
                      "sms": {
                        "description": "The submitter agreed to text messages at the phone given.",
                        "type": "boolean"
                      },
                      "text": {
                        "description": "The consent wording the submitter saw.",
                        "type": "string",
                        "maxLength": 4000
                      }
                    },
                    "additionalProperties": false
                  },
                  "submission_id": {
                    "description": "Optional. An id naming this submission, also accepted as the Idempotency-Key header; with none, the answer's submission_id names it. Send the same value only when retrying the same submission: a retry returns the first answer and stores nothing again.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "idempotency_key": {
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "email"
                ],
                "additionalProperties": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "lead_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "contact_id": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "submission_id": {
                          "type": "string"
                        },
                        "replayed": {
                          "type": "boolean"
                        },
                        "ignored_fields": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "contact_id",
                        "ignored_fields",
                        "lead_id",
                        "replayed",
                        "submission_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/domain.search": {
      "post": {
        "operationId": "call_domain_search",
        "summary": "Call domain.search",
        "description": "Find domain names the member could buy and what each costs — 'what domains are available?', 'is mybrand.com free?', 'find me a good name for this'. Find domain names the customer could buy, with what each costs per year. Every name is for ONE year and renews at the same kind of price — there is no first-year discount that jumps later. Read the price back before anyone commits to anything, and note that a name marked premium costs more to renew as well. This only looks; it never buys. Not for getting a name ready to buy — that is `domain.purchase`.\n\nEvery 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.",
        "tags": [
          "domain"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "type": "string",
                    "minLength": 1,
                    "description": "What the customer wants their address to be — a bare name like `acme` or a full one like `acme.com`. Pass what they said."
                  },
                  "tlds": {
                    "description": "Optional. Restrict to these endings (`com`, `io`, `co`), without the dot. Leave it out to let the registrar suggest.",
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "query"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "candidates": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string"
                              },
                              "available": {
                                "type": "boolean"
                              },
                              "source": {
                                "type": "string"
                              },
                              "customer_price_cents": {
                                "anyOf": [
                                  {
                                    "type": "number"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "customer_renewal_price_cents": {
                                "anyOf": [
                                  {
                                    "type": "number"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "currency": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "premium": {
                                "type": "boolean"
                              },
                              "unavailable_reason": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "name",
                              "available",
                              "source",
                              "customer_price_cents",
                              "customer_renewal_price_cents",
                              "currency",
                              "premium",
                              "unavailable_reason"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "term_years": {
                          "type": "number"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "candidates",
                        "term_years",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/domain.status": {
      "post": {
        "operationId": "call_domain_status",
        "summary": "Call domain.status",
        "description": "Say whether a domain's setup has come through yet — 'is my domain verified?', 'did the DNS work?', 'is it ready yet?'. Check whether a domain's Goosy Grow use is resolving yet, and record it as verified when it is. If checkable is false, say plainly that this one cannot be confirmed from here because Goosy Grow generates those records for the account — do not present it as failing or ask the member to wait. Otherwise relay the state and, when it is not verified yet, what DNS actually answered. Not for a page's own addresses — that is `page.domain_status`.\n\nEvery 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.",
        "tags": [
          "domain"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "domain_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The domain, as a UUID. Take it from the conversation's context or from the workspace's domain list — never invent one."
                  },
                  "use": {
                    "type": "string",
                    "enum": [
                      "mail",
                      "crm_links",
                      "funnel"
                    ],
                    "description": "What the domain should be used for in Goosy Grow: `mail` (sending email), `crm_links` (the branded links in emails and texts), or `funnel` (funnels and sites)."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "domain_id",
                  "use"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "domain_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "hostname": {
                          "type": "string"
                        },
                        "use": {
                          "type": "string",
                          "enum": [
                            "mail",
                            "crm_links",
                            "funnel"
                          ]
                        },
                        "state": {
                          "type": "string"
                        },
                        "just_verified": {
                          "type": "boolean"
                        },
                        "checkable": {
                          "type": "boolean"
                        },
                        "observed": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "checkable",
                        "domain_id",
                        "hostname",
                        "just_verified",
                        "observed",
                        "state",
                        "use",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/domain.records": {
      "post": {
        "operationId": "call_domain_records",
        "summary": "Call domain.records",
        "description": "Show what DNS a domain has and what still has to be added — 'what records do I need?', 'is the DNS set up?', 'why isn't my domain working yet?'. Show a domain's DNS: if we manage it, exactly what's in place (the records we added are marked); if we don't, the records the customer still has to add plus what the domain answers with right now. zone_held false is a normal answer, not a problem. ALWAYS relay the copy_card lines — they're written for the customer to follow. Not for whether the domain is serving yet — that is `page.domain_status`.\n\nEvery 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.",
        "tags": [
          "domain"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "domain_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The domain, as a UUID. Take it from the conversation's context or from the workspace's domain list — never invent one."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "domain_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "domain_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "hostname": {
                          "type": "string"
                        },
                        "zone_held": {
                          "type": "boolean"
                        },
                        "zone_name": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "records": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "type": {
                                "type": "string"
                              },
                              "name": {
                                "type": "string"
                              },
                              "value": {
                                "type": "string"
                              },
                              "priority": {
                                "anyOf": [
                                  {
                                    "type": "number"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "ttl": {
                                "anyOf": [
                                  {
                                    "type": "number"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "source": {
                                "type": "string"
                              },
                              "placed_by_us": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "type",
                              "name",
                              "value",
                              "priority",
                              "ttl",
                              "source",
                              "placed_by_us"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "copy_card": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "copy_card",
                        "domain_id",
                        "hostname",
                        "records",
                        "zone_held",
                        "zone_name",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/domain.set_use": {
      "post": {
        "operationId": "call_domain_set_use",
        "summary": "Call domain.set_use",
        "description": "Set one of the member's domains up for sending email, branded links, or funnels and sites — 'use this domain for my emails', 'set up my links domain', 'I want funnels on my own address'. Set a domain up for one of Goosy Grow's uses: mail (sending email), crm_links (branded links in emails and texts), or funnel (funnels and sites). Where we manage the domain's DNS we add the records for the customer; where we do not, we work out exactly which records they need. Either way ONE step is always theirs: opening Goosy Grow and adding the domain on the screen this returns. ALWAYS relay the copy_card lines and the deep_link — that is the point of the call — and never say the setup is finished, because it is not until they have clicked and domain.status confirms it. outcome zone_not_held and records_from_grow_screen are normal answers, not errors. Not for pointing a domain at a site — that is `domain.connect`.\n\nEvery 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.",
        "tags": [
          "domain"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "domain_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The domain, as a UUID. Take it from the conversation's context or from the workspace's domain list — never invent one."
                  },
                  "use": {
                    "type": "string",
                    "enum": [
                      "mail",
                      "crm_links",
                      "funnel"
                    ],
                    "description": "What the domain should be used for in Goosy Grow: `mail` (sending email), `crm_links` (the branded links in emails and texts), or `funnel` (funnels and sites)."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "domain_id",
                  "use"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "domain_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "hostname": {
                          "type": "string"
                        },
                        "use": {
                          "type": "string",
                          "enum": [
                            "mail",
                            "crm_links",
                            "funnel"
                          ]
                        },
                        "state": {
                          "type": "string"
                        },
                        "outcome": {
                          "type": "string"
                        },
                        "deep_link": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "screen": {
                          "type": "string"
                        },
                        "screen_path_verified": {
                          "type": "boolean"
                        },
                        "records": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "type": {
                                "type": "string"
                              },
                              "name": {
                                "type": "string"
                              },
                              "value": {
                                "type": "string"
                              },
                              "source": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "type",
                              "name",
                              "value",
                              "source"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "copy_card": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "copy_card",
                        "deep_link",
                        "domain_id",
                        "hostname",
                        "outcome",
                        "records",
                        "screen",
                        "screen_path_verified",
                        "state",
                        "use",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/domain.connect": {
      "post": {
        "operationId": "call_domain_connect",
        "summary": "Call domain.connect",
        "description": "Point a domain the member already owns at one of their sites — 'I want to use mydomain.com for this', 'connect the domain I bought', 'hook my own address up to this page'. Connect a domain the customer already owns to one of their pages. It reserves the name and starts the certificate, then hands back the DNS records they must add at whoever manages that domain's DNS. ALWAYS relay those records and the copy_card — the connection does not finish until the customer adds them. Never say the domain is live: use domain.records or page.domain_status to check. Not for moving a connected domain from one site to another — that is `domain.point_at_site`.\n\nEvery 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.",
        "tags": [
          "domain"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "hostname": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The domain the customer already owns, e.g. example.com or offers.example.com. Pass what they said — a pasted URL, a trailing dot or mixed case are all normalized. A name under the platform's own address is refused."
                  },
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The SITE the member means, as a site UUID. You are NOT shown the id of the site open on screen — it never appears in your context, so there is nothing to copy. When they say 'this site', 'the site I'm looking at', or name no site at all, they mean that on-screen site, and the way to reach it is: where this schema leaves site_id OPTIONAL, OMIT IT ENTIRELY — that is the primary path, not a fallback, and the turn's own surface resolves it server-side. Where the schema REQUIRES it, call page.list with `name` set to the site they named — it returns that one site's id, or the candidates to ask them about. Never pass a board, board-item, thread or any other id that merely happens to be nearby in the conversation — those name different objects and will be refused — and never one you composed."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "hostname",
                  "site_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "domain_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "hostname": {
                          "type": "string"
                        },
                        "activation_status": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "dcv_status": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "overall": {
                          "type": "string"
                        },
                        "records": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "type": {
                                "type": "string"
                              },
                              "name": {
                                "type": "string"
                              },
                              "value": {
                                "type": "string"
                              },
                              "priority": {
                                "anyOf": [
                                  {
                                    "type": "number"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "ttl": {
                                "anyOf": [
                                  {
                                    "type": "number"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "source": {
                                "type": "string"
                              },
                              "placed_by_us": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "type",
                              "name",
                              "value",
                              "priority",
                              "ttl",
                              "source",
                              "placed_by_us"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "copy_card": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "activation_status",
                        "copy_card",
                        "dcv_status",
                        "domain_id",
                        "hostname",
                        "overall",
                        "records",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/domain.point_at_site": {
      "post": {
        "operationId": "call_domain_point_at_site",
        "summary": "Call domain.point_at_site",
        "description": "Move a domain the member already has onto a different site — 'point mydomain.com at the new page instead', 'move my domain to this site', 'that address should go somewhere else now'. Move one of the customer's domains onto a different page. If serving_now comes back false the address is assigned but nothing is being served on it yet — read revision to tell which case it is. revision null: the page has never been published, so say that and offer to publish. revision set: this is a name we bought for the customer and it is not answering on the internet yet, so say that instead and never blame the page. Either way, do not call it live. The address we gave a page (its goosydoes.com name) belongs to that page and cannot be moved. Not for connecting a domain for the first time — that is `domain.connect`. 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.\n\nEvery 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.",
        "tags": [
          "domain"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "domain_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The domain, as a UUID. Take it from the conversation's context or from the workspace's domain list — never invent one."
                  },
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The SITE the member means, as a site UUID. You are NOT shown the id of the site open on screen — it never appears in your context, so there is nothing to copy. When they say 'this site', 'the site I'm looking at', or name no site at all, they mean that on-screen site, and the way to reach it is: where this schema leaves site_id OPTIONAL, OMIT IT ENTIRELY — that is the primary path, not a fallback, and the turn's own surface resolves it server-side. Where the schema REQUIRES it, call page.list with `name` set to the site they named — it returns that one site's id, or the candidates to ask them about. Never pass a board, board-item, thread or any other id that merely happens to be nearby in the conversation — those name different objects and will be refused — and never one you composed."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "domain_id",
                  "site_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "domain_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "hostname": {
                          "type": "string"
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "site_name": {
                          "type": "string"
                        },
                        "revision": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "serving_now": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/domain.transfer_out": {
      "post": {
        "operationId": "call_domain_transfer_out",
        "summary": "Call domain.transfer_out",
        "description": "Give the member the steps to move a domain we bought them to another registrar — 'I want to move my domain elsewhere', 'how do I transfer this out?', 'get me the auth code'. Give the customer the exact steps to move a domain we registered for them to another registrar, and say whether it may leave yet. We can't do the move for them — the unlock and the authorization code are done in the registrar's own dashboard — so relay guided_step in order. Relay the eligibility reason WORD FOR WORD: eligible means no hold is visible from the registration date, NOT a guarantee the transfer will be accepted. This prepares only; nothing is transferred by this call. Not for pointing it at another site here — that is `domain.point_at_site`. 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.\n\nEvery 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.",
        "tags": [
          "domain"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "domain_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The domain, as a UUID. Take it from the conversation's context or from the workspace's domain list — never invent one."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "domain_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "domain_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "hostname": {
                          "type": "string"
                        },
                        "supported": {
                          "type": "boolean"
                        },
                        "reason": {
                          "type": "string"
                        },
                        "guided_step": {
                          "type": "object",
                          "properties": {
                            "title": {
                              "type": "string"
                            },
                            "url": {
                              "type": "string"
                            },
                            "steps": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            }
                          },
                          "required": [
                            "title",
                            "url",
                            "steps"
                          ],
                          "additionalProperties": false
                        },
                        "eligibility": {
                          "type": "object",
                          "properties": {
                            "eligible": {
                              "type": "boolean"
                            },
                            "reason": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "earliest_transfer_at": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": [
                            "eligible",
                            "reason",
                            "earliest_transfer_at"
                          ],
                          "additionalProperties": false
                        },
                        "hold_window_days": {
                          "type": "number"
                        },
                        "auto_approve_after_days": {
                          "type": "number"
                        },
                        "transfer_state": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/site.request": {
      "post": {
        "operationId": "call_site_request",
        "summary": "Call site.request",
        "description": "Do something through a site's own backend — 'save that through the site's admin', 'add a record the way the site does it', 'hit my site's own API for me'.  Call one of this site's OWN routes — its admin save route, its API — signed in as the member, exactly as their browser would. Use it to operate a site's own backend: add a record, change a setting, read an admin listing. The path is site-local and starts with a slash; the site decides what each route does, so read the site's code or ask the member rather than guessing a route or a body shape. A members-only route is reachable this way and no other way from chat. A GET runs straight away; a POST, PUT, PATCH or DELETE changes the live site, so the member sees the method, the path and the site on a card and approves it before anything is sent. Not for reading or changing the site's own database — that is `site.database.query` or `site.database.execute`. 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.\n\nEvery 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.",
        "tags": [
          "site"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The site, as a UUID. Take it from page.list or from the conversation's context — never invent one."
                  },
                  "method": {
                    "type": "string",
                    "enum": [
                      "GET",
                      "POST",
                      "PUT",
                      "PATCH",
                      "DELETE"
                    ],
                    "description": "The HTTP method the site's route expects. Use GET to read and POST/PUT/PATCH/DELETE to change something."
                  },
                  "path": {
                    "type": "string",
                    "maxLength": 2048,
                    "pattern": "^\\/(?![/\\\\])[^\\s\\\\@]*$",
                    "description": "The route on the site, starting with a slash — for example /api/admin/save. Include the query string if the route needs one. Never a full URL and never another host."
                  },
                  "body": {
                    "description": "The JSON body, for POST, PUT and PATCH. Shape it the way the site's own route expects; if you do not know that shape, read the site's code or ask the operator rather than guessing."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "site_id",
                  "method",
                  "path"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "hostname": {
                          "type": "string"
                        },
                        "method": {
                          "type": "string",
                          "enum": [
                            "GET",
                            "POST",
                            "PUT",
                            "PATCH",
                            "DELETE"
                          ]
                        },
                        "path": {
                          "type": "string"
                        },
                        "status": {
                          "type": "integer"
                        },
                        "headers": {
                          "type": "object",
                          "propertyNames": {
                            "type": "string"
                          },
                          "additionalProperties": {
                            "type": "string"
                          }
                        },
                        "body": {},
                        "truncated": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/site.database.query": {
      "post": {
        "operationId": "call_site_database_query",
        "summary": "Call site.database.query",
        "description": "Look inside a site's own database — 'what's in my site's database?', 'how many bookings are stored?', 'show me the products the site has'.  Read this site's own database with one read-only SQL statement. It is the site's whole schema — the same database the site's own code reads as env.DB — so start with `select name from sqlite_master where type='table'` if you do not know it. Put every value in `params` as a ? placeholder. The statement must start with select, with, explain, or pragma table_info / table_list and carry no semicolon: this tool REFUSES anything that could change data or schema. Not for changing data or schema — that is `site.database.execute`.\n\nEvery 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.",
        "tags": [
          "site"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The site, as a UUID. Take it from page.list or from the conversation's context — never invent one."
                  },
                  "sql": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 8192,
                    "description": "ONE read-only SQL statement for this site's own SQLite (D1) database. It must start with select, with, explain, or pragma table_info / pragma table_list, carry no semicolon, and change nothing — anything that inserts, updates, deletes, replaces, creates, drops, alters or attaches is refused here; site.database.execute is the door for those. Put every value in `params` as a ? placeholder. Use `select name from sqlite_master where type='table'` first if you do not know the schema."
                  },
                  "params": {
                    "description": "The values for the ? placeholders, in order. Always strings — SQLite converts them.",
                    "maxItems": 256,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "maxLength": 4096
                    }
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "site_id",
                  "sql"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "rows": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "propertyNames": {
                              "type": "string"
                            },
                            "additionalProperties": {}
                          }
                        },
                        "row_count": {
                          "type": "integer"
                        },
                        "truncated": {
                          "type": "boolean"
                        },
                        "rows_read": {
                          "type": "integer"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "row_count",
                        "rows",
                        "rows_read",
                        "site_id",
                        "truncated",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/site.database.execute": {
      "post": {
        "operationId": "call_site_database_execute",
        "summary": "Call site.database.execute",
        "description": "Change what a site's own database holds — 'add that product to my site's shop', 'update the price in the site's database', 'delete that stale record from the site'.  Change this site's own database with one SQL statement — insert, update, delete, or a schema change the site's code expects. Calling it raises the approval card showing the exact statement — and, for an update or delete, how many rows it touches — which is the member's confirmation. Put every value in `params` as a ? placeholder, and read the schema with site.database.query before writing. NEVER run a delete or update without a where clause, and never describe anything as changed before the member has approved. Not for reading the database — that is `site.database.query`. 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.\n\nEvery 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.",
        "tags": [
          "site"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The site, as a UUID. Take it from page.list or from the conversation's context — never invent one."
                  },
                  "sql": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 8192,
                    "description": "ONE SQL statement for this site's own SQLite (D1) database. Put every value in `params` as a ? placeholder — never paste a value into the SQL, not even one the operator typed. Use site.database.query with `select name from sqlite_master where type='table'` first if you do not know the schema."
                  },
                  "params": {
                    "description": "The values for the ? placeholders, in order. Always strings — SQLite converts them.",
                    "maxItems": 256,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "maxLength": 4096
                    }
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "site_id",
                  "sql"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "changes": {
                          "type": "integer"
                        },
                        "rows_written": {
                          "type": "integer"
                        },
                        "rows": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "propertyNames": {
                              "type": "string"
                            },
                            "additionalProperties": {}
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/workspace_sets.list": {
      "post": {
        "operationId": "call_workspace_sets_list",
        "summary": "Call workspace_sets.list",
        "description": "List this account's NAMED groups of brands — the sets a command can address, each with the brands YOU can actually reach in it. Use it before workspace_sets.update to find the setId, and whenever the operator names a group ('the north america ones') so you address the set they already have instead of describing one. Read-only. Not for the individual brands this account can open — that is `workspace_sets.list_brands`.\n\nEvery 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.",
        "tags": [
          "workspace_sets"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "sets": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "setId": {
                                "type": "string"
                              },
                              "handle": {
                                "type": "string"
                              },
                              "name": {
                                "type": "string"
                              },
                              "selectorKind": {
                                "type": "string"
                              },
                              "memberCount": {
                                "anyOf": [
                                  {
                                    "type": "number"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "memberNames": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              }
                            },
                            "required": [
                              "setId",
                              "handle",
                              "name",
                              "selectorKind",
                              "memberCount",
                              "memberNames"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "unrecognizedCount": {
                          "type": "number"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "sets",
                        "unrecognizedCount",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/workspace_sets.list_brands": {
      "post": {
        "operationId": "call_workspace_sets_list_brands",
        "summary": "Call workspace_sets.list_brands",
        "description": "List the brands in this account you can actually open, each with the id a group needs. Use it whenever the operator names brands in their own words ('the two new locations', 'our Austin one') so you can turn those names into ids for workspace_sets.create — never invent or guess an id, and never ask the operator to find one. Read-only. Not for the named groups already set up — that is `workspace_sets.list`.\n\nEvery 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.",
        "tags": [
          "workspace_sets"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "brands": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "workspaceId": {
                                "type": "string"
                              },
                              "displayName": {
                                "type": "string"
                              },
                              "slug": {
                                "type": "string"
                              },
                              "companyType": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "workspaceId",
                              "displayName",
                              "slug",
                              "companyType"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "truncated": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "brands",
                        "truncated",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.list": {
      "post": {
        "operationId": "call_page_list",
        "summary": "Call page.list",
        "description": "List this workspace's customer pages — name, draft/live status, address, last activity and lead count — plus the workspace totals (total_count, live_count, leads_this_month). The reply is ONE PAGE of sites, newest activity first: when it carries next_cursor there are more, so say how many you showed of total_count and pass next_cursor as cursor to read the next page (if the sites changed in between, the cursor is refused: start again from the first page and read the list over rather than joining it to what you have). Pass list 'templates' to read the template catalogue instead — the first-party template ids page.create accepts and every saved template this account can start from, named so you can offer them by name, also one page at a time. That template list is WIDER than this workspace: some were published by other workspaces in the same account and some are ours and shipped to every account — each row says which (`scope`), whether this workspace authored it (`owned_by_this_workspace`), and whether you may withdraw it (`retirable`). Only a row with `retirable: true` can be retired here. Reach for sites when the member asks WHICH sites they have — 'what pages do I have?', 'show me my sites', 'is the pricing page live yet?' — or when they name a site that is NOT the one already open on screen and you need its id; reach for templates only before offering a template by name. Not for one site's own state — that is `page.read` — and not for finding the site already open on their screen: that surface already carries its id, and listing the workspace to rediscover it is the hunt that ends in the wrong id.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "include_archived": {
                    "description": "True to include archived pages. Leave unset for the board's normal view.",
                    "type": "boolean"
                  },
                  "list": {
                    "description": "Which list to read. 'sites' (the default) is the workspace's pages. 'templates' is the template catalogue page.create starts from — ask for it only when the member wants to pick or hear about a template; it returns no sites.",
                    "type": "string",
                    "enum": [
                      "sites",
                      "templates"
                    ]
                  },
                  "limit": {
                    "description": "How many rows to return — at most 50; omit for 10 sites or 7 templates. The reply is one PAGE: a next_cursor in it says rows remain.",
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "maximum": 50
                  },
                  "cursor": {
                    "description": "Where to continue: pass the next_cursor from the previous reply, with the same list, include_archived and name. Omit it for the first page. If the list changed since that page, the cursor is refused: start again without it.",
                    "type": "string",
                    "minLength": 1
                  },
                  "name": {
                    "description": "The site's name or address as the member said it (\"Spring promo\", \"spring-promo.example.com\"). Returns just that site with its site_id — an exact name or address first, else the one site whose name starts with it. When several fit, the result lists them as candidates: ask the member which one, never pick. Use this whenever a verb needs a site_id for a site they NAMED. Not with list templates — that call is refused.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 253
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "sites": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "site_id": {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                              },
                              "name": {
                                "type": "string"
                              },
                              "status": {
                                "type": "string"
                              },
                              "hostname": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "published_at": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "updated_at": {
                                "type": "string"
                              },
                              "archived": {
                                "type": "boolean"
                              },
                              "lead_count": {
                                "type": "integer",
                                "minimum": 0
                              }
                            },
                            "required": [
                              "site_id",
                              "name",
                              "status",
                              "hostname",
                              "published_at",
                              "updated_at",
                              "archived",
                              "lead_count"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "list": {
                          "type": "string",
                          "enum": [
                            "sites",
                            "templates"
                          ]
                        },
                        "next_cursor": {
                          "type": "string"
                        },
                        "templates_total": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "total_count": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "live_count": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "leads_this_month": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "template_ids": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "name_match": {
                          "type": "object",
                          "properties": {
                            "kind": {
                              "type": "string",
                              "enum": [
                                "exact",
                                "prefix",
                                "ambiguous",
                                "none"
                              ]
                            },
                            "name": {
                              "type": "string"
                            },
                            "searched": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "total": {
                              "type": "integer",
                              "minimum": 0
                            }
                          },
                          "required": [
                            "kind",
                            "name",
                            "searched",
                            "total"
                          ],
                          "additionalProperties": false
                        },
                        "blueprints": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "blueprint_id": {
                                "type": "string"
                              },
                              "name": {
                                "type": "string"
                              },
                              "description": {
                                "type": "string"
                              },
                              "scope": {
                                "type": "string",
                                "enum": [
                                  "platform",
                                  "tenant"
                                ]
                              },
                              "owned_by_this_workspace": {
                                "type": "boolean"
                              },
                              "retirable": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "blueprint_id",
                              "name",
                              "description",
                              "scope",
                              "owned_by_this_workspace",
                              "retirable"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "blueprints",
                        "leads_this_month",
                        "live_count",
                        "sites",
                        "template_ids",
                        "total_count",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.list_files": {
      "post": {
        "operationId": "call_page_list_files",
        "summary": "Call page.list_files",
        "description": "Answer a member's question about which FILES a site is built from — 'what files does this site have?', 'show me the code', 'which file is the hero in?', 'where does the pricing copy live?'. No site id is needed — it works on the site the member has open on screen. It is for showing and explaining the source; a change the member asks for goes to `page.edit`, whose coding agent finds the place itself. It is the same tree the Files board shows, for every site whose files we hold, however it was made or brought in. A site we hold no source for answers kind: no_source_snapshot; say so rather than inventing files. A BIG PROJECT ANSWERS IN PAGES: total is the real file count, and when more files follow the result carries next_cursor — call again with cursor: next_cursor and the same path_prefix and contains to read on (if the site's files changed in between, the cursor is refused: start again from the first page and read it over rather than joining the lists), or pass path_prefix (`app/`, `components/`, `src/pages/`) to walk one directory at a time. NEVER guess a path: if you have not seen it listed here, page or narrow until you have. CHECK can_write: when it is false this site's files are READ-ONLY here — answer questions about them and offer no edit, because every edit will refuse it. To answer WHERE some words live — the date, headline or sentence a member asks about — pass contains with a short fragment of them: only the files holding it are listed, each with match_line and match_text. Not for what is inside one file, or for making a change — that is `page.read_file` or `page.edit`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "description": "Optional site UUID. You are NOT shown the id of the site open on screen — it never appears in your context, so there is nothing to copy and nothing to look up. OMIT IT ENTIRELY and this call lists the files of that on-screen site; that is the PRIMARY path, not a fallback, and the turn's own surface resolves it server-side. Pass it only when the member explicitly named a DIFFERENT site and you took its id from page.list. Never pass a board, board-item, thread or any other id that merely happens to be nearby — those name different objects and will be refused.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "path_prefix": {
                    "description": "Optional. List only the paths that start with this — `app/`, `components/`, `src/pages/`. Use it on a large project to walk one directory at a time; omit it for the first call, which shows the top of the tree and the true total.",
                    "type": "string",
                    "maxLength": 1024
                  },
                  "cursor": {
                    "description": "Optional. Where to continue: when a result carries next_cursor there are more files — call again with cursor set to it and the same site_id, path_prefix and contains to read the rest. Omit it for the first page. Never guess a path you have not seen listed; page or narrow instead.",
                    "type": "string",
                    "minLength": 1
                  },
                  "contains": {
                    "description": "Optional. Find WHERE some words live: only the text files whose contents contain this (case-insensitive, within one line) are listed, each with match_line and match_text — the first line it appears on. Use a short fragment of the words that are on the page NOW, e.g. 'Sept 22' to find the date a member asked to change; then page.read_file that file around match_line. total counts the matching files.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 1024
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "kind": {
                          "type": "string",
                          "enum": [
                            "source_snapshot",
                            "no_source_snapshot"
                          ]
                        },
                        "source_ref": {
                          "type": "string"
                        },
                        "reason": {
                          "type": "string",
                          "enum": [
                            "bundle",
                            "not_generated"
                          ]
                        },
                        "can_write": {
                          "type": "boolean"
                        },
                        "files": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "path": {
                                "type": "string"
                              },
                              "size": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "kind": {
                                "type": "string",
                                "enum": [
                                  "page",
                                  "style",
                                  "script",
                                  "config",
                                  "image",
                                  "other"
                                ]
                              },
                              "match_line": {
                                "type": "integer",
                                "exclusiveMinimum": 0
                              },
                              "match_text": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "path",
                              "size",
                              "kind"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "truncated": {
                          "type": "boolean"
                        },
                        "total": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "next_cursor": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "can_write",
                        "files",
                        "kind",
                        "site_id",
                        "total",
                        "truncated",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.read_file": {
      "post": {
        "operationId": "call_page_read_file",
        "summary": "Call page.read_file",
        "description": "Answer a member's question about what is IN one of a site's files — 'what's in Hero.astro?', 'show me the homepage code', 'let me see that file', 'what does the header say in the code?'. No site id is needed — it works on the site the member has open on screen. It reads one source file in a window of lines, for showing and explaining it; a change the member asks for goes to `page.edit`, whose coding agent reads the files itself. The result carries the source_ref the file was read at. When has_more is true the file continues; read the next window from end_line + 1 to answer about the rest. A binary file answers kind: binary with no content. Not for finding which file holds something, or for making a change — that is `page.list_files` or `page.edit`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "description": "Optional site UUID. You are NOT shown the id of the site open on screen — it never appears in your context, so there is nothing to copy and nothing to look up. OMIT IT ENTIRELY and this call reads from that on-screen site; that is the PRIMARY path, not a fallback, and the turn's own surface resolves it server-side. Pass it only when the member explicitly named a DIFFERENT site and you took its id from page.list. Never pass a board, board-item, thread or any other id that merely happens to be nearby — those name different objects and will be refused.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "path": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 1024,
                    "description": "The file's project-relative path exactly as page.list_files reported it (for example `src/pages/index.astro`). Never a leading slash, never `..`."
                  },
                  "start_line": {
                    "description": "The first line to read (1-based). Leave it out to start at the top; when the result says has_more, call again from end_line + 1.",
                    "type": "integer",
                    "minimum": 1
                  },
                  "max_lines": {
                    "description": "How many lines to read, at most 200. A long file is read in windows; never guess the part you have not read.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 200
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "path"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "path": {
                          "type": "string"
                        },
                        "source_ref": {
                          "type": "string"
                        },
                        "kind": {
                          "type": "string",
                          "enum": [
                            "text",
                            "binary"
                          ]
                        },
                        "size": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "content": {
                          "type": "string"
                        },
                        "start_line": {
                          "type": "integer",
                          "minimum": 1
                        },
                        "end_line": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "total_lines": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "has_more": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "has_more",
                        "kind",
                        "path",
                        "site_id",
                        "size",
                        "source_ref",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.checkpoint": {
      "post": {
        "operationId": "call_page_checkpoint",
        "summary": "Call page.checkpoint",
        "description": "Say what has changed on a site and where it stands now — 'what did you change?', 'what have we got saved?', 'can I go back to before that?', 'why did the last build fail?', 'what version is this on?'. No site id is needed — it works on the site the member has open on screen. It reports where the site's source stands: the checkpoint it is at (current_source_ref — every edit is made from it), the ledger of checkpoints newest first with each one's build status and revision, and the newest build with its failure log tail when it failed. A checkpoint is made by every change to the site's files and by the member's save; use this to name a checkpoint for page.rollback, a revision for page.republish_revision, or to read why the last build failed. Not for undoing a change — that is `page.rollback`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "description": "Optional site UUID. You are NOT shown the id of the site open on screen — it never appears in your context, so there is nothing to copy and nothing to look up. OMIT IT ENTIRELY and this call reads that on-screen site; that is the PRIMARY path, not a fallback, and the turn's own surface resolves it server-side. Pass it only when the member explicitly named a DIFFERENT site and you took its id from page.list. Never pass a board, board-item, thread or any other id that merely happens to be nearby — those name different objects and will be refused.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "current_source_ref": {
                          "type": "string"
                        },
                        "checkpoints": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "source_ref": {
                                "type": "string"
                              },
                              "stored_at": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "bytes": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "is_current": {
                                "type": "boolean"
                              },
                              "build_status": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "enum": [
                                      "queued",
                                      "pending",
                                      "running",
                                      "retrying",
                                      "succeeded",
                                      "failed"
                                    ]
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "revision": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "source_ref",
                              "stored_at",
                              "bytes",
                              "is_current",
                              "build_status",
                              "revision"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "truncated": {
                          "type": "boolean"
                        },
                        "latest_build": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "build_run_id": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "source_ref": {
                                  "type": "string"
                                },
                                "status": {
                                  "type": "string",
                                  "enum": [
                                    "queued",
                                    "pending",
                                    "running",
                                    "retrying",
                                    "succeeded",
                                    "failed"
                                  ]
                                },
                                "revision": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "failure": {
                                  "anyOf": [
                                    {
                                      "type": "object",
                                      "properties": {
                                        "code": {
                                          "type": "string"
                                        },
                                        "log_tail": {
                                          "type": "string"
                                        },
                                        "truncated": {
                                          "type": "boolean"
                                        }
                                      },
                                      "required": [
                                        "code",
                                        "log_tail",
                                        "truncated"
                                      ],
                                      "additionalProperties": false
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              },
                              "required": [
                                "build_run_id",
                                "source_ref",
                                "status",
                                "revision",
                                "failure"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "checkpoints",
                        "current_source_ref",
                        "latest_build",
                        "site_id",
                        "truncated",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.domain_status": {
      "post": {
        "operationId": "call_page_domain_status",
        "summary": "Call page.domain_status",
        "description": "Answer 'is my domain live yet?' for a page — 'is my domain working', 'why isn't my domain connected', 'check my domain again'. Every address the page holds comes back with the domains card's state (Live, Waiting for record, Issuing certificate or Needs attention) and, when something is wrong, a reason that says why; relay the state and the reason in the member's words, and call a name connected only when its state is Live. A custom domain still settling is re-checked on the spot and the check is recorded, so checked_at is the time of this answer; if rechecked is false for a domain, say the state is the last one we recorded. It only reads and costs nothing. Not for a Goosy Grow domain use such as mail or links — that is `domain.status`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "description": "The SITE the member means, as a site UUID. You are NOT shown the id of the site open on screen — it never appears in your context, so there is nothing to copy. When they say 'this site', 'the site I'm looking at', or name no site at all, they mean that on-screen site, and the way to reach it is: where this schema leaves site_id OPTIONAL, OMIT IT ENTIRELY — that is the primary path, not a fallback, and the turn's own surface resolves it server-side. Where the schema REQUIRES it, call page.list with `name` set to the site they named — it returns that one site's id, or the candidates to ask them about. Never pass a board, board-item, thread or any other id that merely happens to be nearby in the conversation — those name different objects and will be refused — and never one you composed.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "domains": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "hostname": {
                                "type": "string"
                              },
                              "type": {
                                "type": "string"
                              },
                              "status": {
                                "type": "string"
                              },
                              "state": {
                                "type": "string",
                                "enum": [
                                  "live",
                                  "redirected_externally",
                                  "waiting_for_record",
                                  "issuing_certificate",
                                  "needs_attention"
                                ]
                              },
                              "state_label": {
                                "type": "string"
                              },
                              "reason": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "steps": {
                                "type": "array",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "key": {
                                      "type": "string"
                                    },
                                    "state": {
                                      "type": "string"
                                    }
                                  },
                                  "required": [
                                    "key",
                                    "state"
                                  ],
                                  "additionalProperties": false
                                }
                              },
                              "checked_at": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "rechecked": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "hostname",
                              "type",
                              "status",
                              "state",
                              "state_label",
                              "reason",
                              "steps",
                              "checked_at",
                              "rechecked"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "cname_target": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "cname_target",
                        "domains",
                        "site_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.connection_summary": {
      "post": {
        "operationId": "call_page_connection_summary",
        "summary": "Call page.connection_summary",
        "description": "Say where this workspace's articles get published when they do not go on our own site — 'where do my posts go?', 'is my WordPress connected?', 'which site do articles land on?'. Read where this workspace publishes articles when it does not publish natively — the connected WordPress or Webflow site. Call it before page.publish_article so you can name the destination. It returns no password or token, and none exists to ask for. Not for publishing the article — that is `page.publish_article`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "connected": {
                          "type": "boolean"
                        },
                        "platform": {
                          "type": "string"
                        },
                        "site_label": {
                          "type": "string"
                        },
                        "collection_id": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "connected",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.set_tracking": {
      "post": {
        "operationId": "call_page_set_tracking",
        "summary": "Call page.set_tracking",
        "description": "Make a form on one of the brand's Pages sites count as a conversion, or stop it counting, or turn one named tracking pixel off for that site, or back on — 'only count the application form as a conversion', 'turn the Meta pixel off here', 'don't track this page'. Call it from any screen: on a site's own page it acts on that site; elsewhere, read the named site's id with `page.list` first and pass it as site_id. A conversion change names conversion_forms, each form by the lowercase name it submits as its `form` field: only those forms' leads are reported to the ad platforms as conversions, and null puts every form back. A pixel change names provider and enabled; which pixels exist at all comes from the workspace's connections. If needs_republish comes back true, say the published version still carries the old tags until the page is republished. If rebuild_queued comes back false, do NOT say the pixel has stopped firing — the override is stored but no new build is on its way. Not for which Google Analytics conversions the performance cards show — that is `connections.set_conversion_events`; not for an imported site's cookie consent banner, or all of its ad pixels at once — that is `page.set_platform_properties`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "description": "The SITE the member means, as a site UUID. You are NOT shown the id of the site open on screen — it never appears in your context, so there is nothing to copy. When they say 'this site', 'the site I'm looking at', or name no site at all, they mean that on-screen site, and the way to reach it is: where this schema leaves site_id OPTIONAL, OMIT IT ENTIRELY — that is the primary path, not a fallback, and the turn's own surface resolves it server-side. Where the schema REQUIRES it, call page.list with `name` set to the site they named — it returns that one site's id, or the candidates to ask them about. Never pass a board, board-item, thread or any other id that merely happens to be nearby in the conversation — those name different objects and will be refused — and never one you composed.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "provider": {
                    "description": "Which connected pixel to toggle. Use a provider key from page.read's pixels list — a provider we do not place is refused.",
                    "type": "string"
                  },
                  "enabled": {
                    "description": "False takes the pixel off THIS page; true puts it back. Which pixels exist at all is decided by the workspace's Connections, not here.",
                    "type": "boolean"
                  },
                  "conversion_forms": {
                    "description": "The forms whose leads count as conversions sent to the ad platforms, by the name each form submits as its `form` field — ['application'] makes only the application form a conversion. null makes every form one again; [] makes none. Omit to leave them as they are.",
                    "anyOf": [
                      {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "disabled_providers": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "needs_republish": {
                          "type": "boolean"
                        },
                        "rebuild_queued": {
                          "type": "boolean"
                        },
                        "conversion_forms": {
                          "anyOf": [
                            {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "site_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.set_share": {
      "post": {
        "operationId": "call_page_set_share",
        "summary": "Call page.set_share",
        "description": "Set the site's link preview: the title, text and card that other sites show when someone shares or links the site — a social post, a message, a search result. Reach for it when the member talks about a link preview, a shared link, a social post or a search result, or says \"when someone shares…\": 'change the share title', 'make the description say …', 'use the big picture card on X'. Call it on the ask, with no look at the files; the site's own code is not touched. Name only the fields the member asked to change. It does NOT change the share image (that is a picture edit) and cannot clear a field. Report each changed field and its new value; the live card updates on the next fetch. Not for the share image, or for what a page is called or listed as in the site's page list and navigation (\"call / name / list / show <page> as …\") — that is `page.edit` or `page.set_page_label`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "description": "The SITE the member means, as a site UUID. You are NOT shown the id of the site open on screen — it never appears in your context, so there is nothing to copy. When they say 'this site', 'the site I'm looking at', or name no site at all, they mean that on-screen site, and the way to reach it is: where this schema leaves site_id OPTIONAL, OMIT IT ENTIRELY — that is the primary path, not a fallback, and the turn's own surface resolves it server-side. Where the schema REQUIRES it, call page.list with `name` set to the site they named — it returns that one site's id, or the candidates to ask them about. Never pass a board, board-item, thread or any other id that merely happens to be nearby in the conversation — those name different objects and will be refused — and never one you composed.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "title": {
                    "description": "The title the site's link card should show, in the member's words. Omit it to leave the title as it is.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 1000
                  },
                  "description": {
                    "description": "The description the site's link card should show, in the member's words. Omit it to leave the description as it is.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 1000
                  },
                  "twitter_card": {
                    "description": "How X / Twitter lays out the card: summary_large_image is the wide picture card, summary the small square one. Omit it to leave the layout as it is.",
                    "type": "string",
                    "enum": [
                      "summary",
                      "summary_large_image"
                    ]
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "changed": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "enum": [
                              "title",
                              "description",
                              "twitter_card"
                            ]
                          }
                        },
                        "share": {
                          "type": "object",
                          "properties": {
                            "title": {
                              "type": "object",
                              "properties": {
                                "value": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "source": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              },
                              "required": [
                                "value",
                                "source"
                              ],
                              "additionalProperties": false
                            },
                            "description": {
                              "type": "object",
                              "properties": {
                                "value": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "source": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              },
                              "required": [
                                "value",
                                "source"
                              ],
                              "additionalProperties": false
                            },
                            "twitter_card": {
                              "type": "object",
                              "properties": {
                                "value": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "source": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              },
                              "required": [
                                "value",
                                "source"
                              ],
                              "additionalProperties": false
                            }
                          },
                          "required": [
                            "title",
                            "description",
                            "twitter_card"
                          ],
                          "additionalProperties": false
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "changed",
                        "share",
                        "site_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.write_article": {
      "post": {
        "operationId": "call_page_write_article",
        "summary": "Call page.write_article",
        "description": "Put a finished article on a site's blog — 'add this post to the blog', 'put this write-up on my site', 'I want this article on the site'. Write a finished article into a site's blog. YOU write the article — pass the headline, a one-sentence summary and the body as subheadings with their paragraphs; nothing here generates copy for you. It does NOT publish: the post is stored and the site is rebuilt, and page.publish_article is what puts it in front of readers. If build_run_id is missing, say the rebuild has not started. Not for putting the article in front of readers — that is `page.publish_article`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "description": "The SITE the member means, as a site UUID. You are NOT shown the id of the site open on screen — it never appears in your context, so there is nothing to copy. When they say 'this site', 'the site I'm looking at', or name no site at all, they mean that on-screen site, and the way to reach it is: where this schema leaves site_id OPTIONAL, OMIT IT ENTIRELY — that is the primary path, not a fallback, and the turn's own surface resolves it server-side. Where the schema REQUIRES it, call page.list with `name` set to the site they named — it returns that one site's id, or the candidates to ask them about. Never pass a board, board-item, thread or any other id that merely happens to be nearby in the conversation — those name different objects and will be refused — and never one you composed.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "title": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "description": "The article headline, as it should appear. Write it — do not ask the tool to invent one."
                  },
                  "summary": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 320,
                    "description": "One sentence. It becomes the page's meta description and the archive card's summary, so make it describe the article rather than tease it."
                  },
                  "sections": {
                    "minItems": 1,
                    "maxItems": 12,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "heading": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 120,
                          "description": "The subheading."
                        },
                        "body": {
                          "minItems": 1,
                          "maxItems": 8,
                          "type": "array",
                          "items": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 1200
                          },
                          "description": "The paragraphs under this subheading."
                        }
                      },
                      "required": [
                        "heading",
                        "body"
                      ],
                      "additionalProperties": false
                    },
                    "description": "The article body, in order: each entry is a subheading plus its paragraphs. Plain text only — it is escaped, so markup is shown rather than rendered."
                  },
                  "slug": {
                    "description": "Optional URL slug. Leave it out to derive one from the title. A slug that already exists on this site is refused rather than suffixed — a second permanent URL is not what the operator asked for.",
                    "type": "string",
                    "maxLength": 72
                  },
                  "author_name": {
                    "description": "Optional byline. Leave it out unless the operator named an author — an invented author is a claim on their site.",
                    "type": "string",
                    "maxLength": 120
                  },
                  "image_url": {
                    "description": "Optional absolute https URL of the lead image. Leave it out unless the operator supplied one.",
                    "type": "string"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "title",
                  "summary",
                  "sections"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "route": {
                          "type": "string"
                        },
                        "slug": {
                          "type": "string"
                        },
                        "source_ref": {
                          "type": "string"
                        },
                        "build_run_id": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "route",
                        "site_id",
                        "slug",
                        "source_ref",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.ingest_bundle": {
      "post": {
        "operationId": "call_page_ingest_bundle",
        "summary": "Call page.ingest_bundle",
        "description": "Bring in a site the member already built somewhere else — 'import my existing site', 'I have a zip of my site', 'pull in the one I built in Webflow'. It takes a public https:// link to a .zip — either a finished build or a project we compile. Give it a site_id to replace an existing site, or leave it out to create a new one. It does NOT publish: say the site was imported, not that it is live. A private, local or metadata address is refused, and so is http:// — relay that refusal rather than retrying. If findings come back, they are advisory notes about search/AI discovery, never a failure of the import. The import_report says what we detected, what came across, what we changed to host it and what could not be brought over: relay those lists, never summarise them away. While import_report.status is \"compiling\" the site is still being built, so page_count is not yet the answer. Not for building a new site from scratch — that is `page.create`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "A full https:// link to a .zip of the site. It must be a public address — a link to a private network, a local address or a cloud metadata endpoint is refused, and so is http://. Pass the operator's link as given; never invent one."
                  },
                  "site_id": {
                    "description": "Optional. The EXISTING site to import into, replacing what is there. Leave it out to create a new site.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "name": {
                    "description": "Optional name for the NEW site this import creates. Ignored when site_id is given.",
                    "type": "string",
                    "maxLength": 80
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "url"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "site_name": {
                          "type": "string"
                        },
                        "kind": {
                          "type": "string",
                          "enum": [
                            "bundle",
                            "prebuilt",
                            "source"
                          ]
                        },
                        "revision": {
                          "type": "string"
                        },
                        "build_run_id": {
                          "type": "string"
                        },
                        "object_count": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "page_count": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "bytes": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "findings": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "rule": {
                                "type": "string"
                              },
                              "severity": {
                                "type": "string"
                              },
                              "path": {
                                "type": "string"
                              },
                              "message": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "rule",
                              "severity",
                              "path",
                              "message"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "import_report": {
                          "type": "object",
                          "properties": {
                            "status": {
                              "type": "string",
                              "enum": [
                                "staged",
                                "compiling",
                                "refused"
                              ]
                            },
                            "detected_kind": {
                              "type": "string",
                              "enum": [
                                "bundle",
                                "prebuilt",
                                "source:astro",
                                "source:vite",
                                "source:next",
                                "source:static-generator",
                                "not_a_site"
                              ]
                            },
                            "markers": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            },
                            "carried": {
                              "type": "object",
                              "properties": {
                                "pages": {
                                  "type": "integer",
                                  "minimum": 0
                                },
                                "assets": {
                                  "type": "integer",
                                  "minimum": 0
                                },
                                "routes": {
                                  "type": "array",
                                  "items": {
                                    "type": "string"
                                  }
                                }
                              },
                              "required": [
                                "pages",
                                "assets",
                                "routes"
                              ],
                              "additionalProperties": false
                            },
                            "approximated": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            },
                            "not_carried": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            },
                            "compile_log_tail": {
                              "type": "string"
                            },
                            "next_step": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "status",
                            "detected_kind",
                            "markers",
                            "carried",
                            "approximated",
                            "not_carried"
                          ],
                          "additionalProperties": false
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "bytes",
                        "findings",
                        "import_report",
                        "kind",
                        "object_count",
                        "page_count",
                        "site_id",
                        "site_name",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.run_build": {
      "post": {
        "operationId": "call_page_run_build",
        "summary": "Call page.run_build",
        "description": "Build the site again and say what the build reports — 'try building it again', 'build it now', 'did that fix the build?', 'run it again and see if it works'. No site id is needed — it works on the site the member has open on screen. It builds the site's current checkpoint on the rail again — after a build failed for a reason you have fixed, or to re-run one. Every change to the site's files already builds, so you rarely need this. The tool waits a short while: a build that finishes in time answers with its outcome, and a FAILED build answers with the failing step's log tail — read it and fix the file it names. A build still running answers still_running: true with its run id; the member's editor shows the log as it lands, and page.checkpoint reports the outcome later. Not for reading why the last build failed without re-running it — that is `page.checkpoint`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "description": "The site to build, as the site_id `page.list` returned for it.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "source_ref": {
                          "type": "string"
                        },
                        "build_run_id": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "queued",
                            "pending",
                            "running",
                            "retrying",
                            "succeeded",
                            "failed"
                          ]
                        },
                        "revision": {
                          "type": "string"
                        },
                        "failure": {
                          "type": "object",
                          "properties": {
                            "code": {
                              "type": "string"
                            },
                            "log_tail": {
                              "type": "string"
                            },
                            "truncated": {
                              "type": "boolean"
                            }
                          },
                          "required": [
                            "code",
                            "log_tail",
                            "truncated"
                          ],
                          "additionalProperties": false
                        },
                        "still_running": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "build_run_id",
                        "site_id",
                        "source_ref",
                        "status",
                        "still_running",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.restore_checkpoint": {
      "post": {
        "operationId": "call_page_restore_checkpoint",
        "summary": "Call page.restore_checkpoint",
        "description": "Undo a change to the site the member is working on — 'undo that', 'put it back how it was', 'I liked it better before', 'take that last change back', 'go back to before the build broke'. Every applied edit leaves a checkpoint, so this is the undo for anything that changed the site's source. This is the member's own working copy. No site id is needed — it works on the site the member has open on screen. It restores the site's DRAFT source to a previous checkpoint and rebuilds — the undo for any change to the site's files (name the checkpoint before it in page.checkpoint's ledger). The live site is untouched; the preview follows the rebuild. The checkpoint left behind stays in the ledger, so a rollback can itself be rolled back. A checkpoint whose archive is gone is refused; relay that and offer another. Not for the live site visitors see — that is `page.republish_revision`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "description": "Optional site UUID. You are NOT shown the id of the site open on screen — it never appears in your context, so there is nothing to copy and nothing to look up. OMIT IT ENTIRELY and this call acts on that on-screen site; that is the PRIMARY path, not a fallback, and the turn's own surface resolves it server-side. Pass it only when the member explicitly named a DIFFERENT site and you took its id from page.list. Never pass a board, board-item, thread or any other id that merely happens to be nearby — those name different objects and will be refused.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "source_ref": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 64,
                    "description": "The checkpoint to go back to — a source_ref from page.checkpoint's ledger. This changes the DRAFT source and its preview only; the live site is untouched (page.republish_revision is the live one)."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "source_ref"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "restored_from_ref": {
                          "type": "string"
                        },
                        "source_ref": {
                          "type": "string"
                        },
                        "base_source_ref": {
                          "type": "string"
                        },
                        "build_run_id": {
                          "type": "string"
                        },
                        "build_enqueue_error": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "base_source_ref",
                        "restored_from_ref",
                        "site_id",
                        "source_ref",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.create": {
      "post": {
        "operationId": "call_page_create",
        "summary": "Call page.create",
        "description": "Make a brand-new website — 'build me a site for my consultancy', 'I need a landing page', 'make a website for the new product'. Create a multi-page website from a blueprint — home, about and contact with working navigation and the full search/AI discovery file set. Describe what the site is for with intent, or leave it out to get starter copy with no paid generation. When the member asked for the site themselves in this conversation it creates it at once — report what the result says; only a site nobody asked for raises its approval card first, which is the member's confirmation, and then it can still be refused. It does NOT publish either: the site is built, not put on the internet, and if build_run_id is missing say the build has not started yet — quoting build_enqueue_error as the reason when it is present, and offering to try the build again. If draft_error comes back and source_ref does not, NOTHING WAS DRAFTED: the site exists and is openable but empty, so say exactly that, quote the reason, and offer to try again ON THAT site_id — never call page.create a second time for the same request, which would leave the member with two pages. Not for changing a site that already exists — that is `page.edit`. 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.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "description": "Optional name for the site. Leave it out to take the default.",
                    "type": "string",
                    "maxLength": 80
                  },
                  "intent": {
                    "description": "What this site is for, in the operator's own terms. Leave it out to get the blueprint's starter copy with no paid generation. Do not invent claims, offers or statistics. A site generated from the general-marketing template carries a lead-capture form on its landing page — email and name, with a consent line — so a request for one is met by creating the site and needs nothing here; anything else about the form (extra fields, different wording, moving it, or taking it off) is a page.edit once the site exists. Two states where a new site does NOT show one, and neither is a reason to tell the member they cannot have a form: a site copied from a saved blueprint carries whatever form that blueprint had, which may be none, and a form saved as `enabled: false` is stored but not rendered. In both cases a page.edit puts one on any page. IGNORED when blueprint_id names one of this workspace's saved blueprints: that path copies the saved template verbatim and runs no generation, so say the copy ran unchanged rather than implying these words shaped it.",
                    "type": "string",
                    "maxLength": 2000
                  },
                  "blueprint_id": {
                    "description": "Which blueprint to start from — a first-party template id or one of this workspace's own saved blueprint ids, both listed by page.list with list 'templates'. Starting from a saved blueprint copies that template and runs no generation. Leave it out for the default general marketing site; an unknown id is refused server-side.",
                    "type": "string"
                  },
                  "inspiration_url": {
                    "description": "Optional full https:// link to a site to take structural inspiration from. Its wording and offers are never reproduced. IGNORED when blueprint_id names one of this workspace's saved blueprints — that path copies a saved template and takes structure from nothing else.",
                    "type": "string"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "name": {
                          "type": "string"
                        },
                        "blueprint_id": {
                          "type": "string"
                        },
                        "source_ref": {
                          "type": "string"
                        },
                        "draft_error": {
                          "type": "string"
                        },
                        "build_run_id": {
                          "type": "string"
                        },
                        "build_enqueue_error": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.patch_file": {
      "post": {
        "operationId": "call_page_patch_file",
        "summary": "Call page.patch_file",
        "description": "Change something on a site by writing its FILES — 'add more space between these cards', 'change the button text to Book a call', 'fix the typo in the footer', 'make the hero heading bigger'. This is the one way every site whose files we hold is changed, however it was made or brought in: copy, styling, layout, a component, a page. Read each file with page.read_file first — start from the selected element's file and line when the turn gives them, or from page.edit's `located`, or find the words with page.list_files and `contains` — and copy `find` text exactly; a hunk that matches nowhere or more than once refuses the whole call and nothing is written. No site id is needed — it works on the site the member has open on screen. One call is ONE saved version, so send a whole change in one call. While a live workbench is showing the site the change appears there in place and no build runs (the result says build_deferred; relay its build_hint); otherwise a build follows and takes a minute or two. The result is the diff (say what it shows, never more), the new source_ref and base_source_ref (page.rollback to it undoes this). Which directories are editable depends on the project: refusals name the reason, so relay them rather than retrying. Dependency manifests and lockfiles, build configuration, generated files, and anything under a build or tooling directory are always refused. A site whose files are READ-ONLY here is refused — page.list_files reports can_write: false for one, so check that before composing a patch. A change the member asked for in this conversation is written at once; only a change nobody asked for — or any change, when the member has asked to see each one first — raises its approval card, which is the member's confirmation, and is not made, saved or built unless they approve it there. Not for rewriting whole named files from an instruction — that is `page.edit_file`. 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.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "files": {
                    "minItems": 1,
                    "maxItems": 8,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "path": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 1024
                        },
                        "hunks": {
                          "minItems": 1,
                          "maxItems": 24,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "find": {
                                "type": "string",
                                "maxLength": 64000
                              },
                              "replace": {
                                "type": "string",
                                "maxLength": 64000
                              }
                            },
                            "required": [
                              "find",
                              "replace"
                            ],
                            "additionalProperties": false
                          }
                        }
                      },
                      "required": [
                        "path",
                        "hunks"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "expected_source_ref": {
                    "type": "string"
                  },
                  "summary": {
                    "type": "string",
                    "maxLength": 2000
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "files"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "source_ref": {
                          "type": "string"
                        },
                        "base_source_ref": {
                          "type": "string"
                        },
                        "build_run_id": {
                          "type": "string"
                        },
                        "build_enqueue_error": {
                          "type": "string"
                        },
                        "build_deferred": {
                          "type": "boolean"
                        },
                        "workbench_pushed": {
                          "type": "boolean"
                        },
                        "build_hint": {
                          "type": "string"
                        },
                        "changed_paths": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "diff": {
                          "type": "string"
                        },
                        "diff_truncated": {
                          "type": "boolean"
                        },
                        "selected_element": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.edit_file": {
      "post": {
        "operationId": "call_page_edit_file",
        "summary": "Call page.edit_file",
        "description": "Change named files of a site from an instruction — 'redo the pricing section in Pricing.astro', 'rewrite this component', 'change the hero copy in src/components/Hero.astro', 'restructure that page's markup'. Goosy's coding agent makes the change in the site's files in place, starting from the files named in paths, and the result is one checkpoint (page.rollback undoes it) with the agent's own one-line summary — relay that, never more. It works on every site whose files we hold, however it was made or brought in; a site whose files are READ-ONLY here is refused, and so are dependency manifests, lockfiles, build configuration and generated files. Each call is a paid authoring run on the site's own plan, and it raises its approval card first, which is the member's confirmation. While a live workbench is showing the site the change appears there and no build runs (the result says build_deferred; relay its build_hint); otherwise a build follows. Not for a change of a few exact lines you already have — that is `page.patch_file`. 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.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "paths": {
                    "minItems": 1,
                    "maxItems": 8,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 1024
                    }
                  },
                  "instruction": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "paths",
                  "instruction"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "source_ref": {
                          "type": "string"
                        },
                        "build_run_id": {
                          "type": "string"
                        },
                        "summary": {
                          "type": "string"
                        },
                        "build_deferred": {
                          "type": "boolean"
                        },
                        "workbench_pushed": {
                          "type": "boolean"
                        },
                        "build_hint": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.schedule_publish": {
      "post": {
        "operationId": "call_page_schedule_publish",
        "summary": "Call page.schedule_publish",
        "description": "Put a site live at a chosen time instead of now — 'publish it on Monday morning', 'schedule this to go live at 9am', 'put it up next Tuesday'. Schedule a page to publish at a chosen time. Send `at` as an ISO-8601 timestamp WITH its UTC offset, resolved against the member's own timezone. It must be at least five minutes away and within the next year. This is a public, consequential act. Call it on the ask: it raises the approval card showing the page's name, its address and the time being committed to, which is the member's confirmation. Never say a page is scheduled unless the result says it is. If `replaced` is true, say you moved an existing schedule rather than adding a second one. Not for publishing right now — that is `page.publish`. 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.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "description": "The SITE the member means, as a site UUID. You are NOT shown the id of the site open on screen — it never appears in your context, so there is nothing to copy. When they say 'this site', 'the site I'm looking at', or name no site at all, they mean that on-screen site, and the way to reach it is: where this schema leaves site_id OPTIONAL, OMIT IT ENTIRELY — that is the primary path, not a fallback, and the turn's own surface resolves it server-side. Where the schema REQUIRES it, call page.list with `name` set to the site they named — it returns that one site's id, or the candidates to ask them about. Never pass a board, board-item, thread or any other id that merely happens to be nearby in the conversation — those name different objects and will be refused — and never one you composed.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "at": {
                    "type": "string",
                    "minLength": 1,
                    "description": "When to publish, as an ISO-8601 timestamp that INCLUDES the UTC offset (for example 2026-09-08T09:00:00-06:00). Never send a bare local time — it would be read as UTC and the page would publish at the wrong hour. Resolve the operator's words against their timezone and state the time back to them in their own words. It must be at least five minutes from now and within the next year."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "at"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "at": {
                          "type": "string"
                        },
                        "revision": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "hostname": {
                          "type": "string"
                        },
                        "replaced": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.cancel_scheduled_publish": {
      "post": {
        "operationId": "call_page_cancel_scheduled_publish",
        "summary": "Call page.cancel_scheduled_publish",
        "description": "Call off a publish that was scheduled for later — 'cancel that scheduled publish', 'don't put it live tomorrow after all', 'stop it going out on Friday'. Call off a page's scheduled publish. If `cancelled` is true, say the scheduled publish has been called off. If it is false, nothing was waiting — say so plainly (it may have already published, or already been cancelled) rather than reporting an error; either way the page will not publish on a timer. Not for moving the publish to another time — that is `page.schedule_publish`. 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.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "description": "The SITE the member means, as a site UUID. You are NOT shown the id of the site open on screen — it never appears in your context, so there is nothing to copy. When they say 'this site', 'the site I'm looking at', or name no site at all, they mean that on-screen site, and the way to reach it is: where this schema leaves site_id OPTIONAL, OMIT IT ENTIRELY — that is the primary path, not a fallback, and the turn's own surface resolves it server-side. Where the schema REQUIRES it, call page.list with `name` set to the site they named — it returns that one site's id, or the candidates to ask them about. Never pass a board, board-item, thread or any other id that merely happens to be nearby in the conversation — those name different objects and will be refused — and never one you composed.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "cancelled": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.publish_article": {
      "post": {
        "operationId": "call_page_publish_article",
        "summary": "Call page.publish_article",
        "description": "Publish an article that has already been written — 'publish that blog post', 'send the article to our WordPress'. target 'native' publishes it on the site hosted here; 'byo' sends the article to the brand's own connected WordPress or Webflow site; 'both' does each. This is irreversible in front of readers. Call it on the ask: it raises the approval card showing where the article would land, which is the member's confirmation. If the result carries 'skipped', say plainly which half did NOT happen and why. Not for writing the article — that is `page.write_article`. 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.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "description": "The SITE the member means, as a site UUID. You are NOT shown the id of the site open on screen — it never appears in your context, so there is nothing to copy. When they say 'this site', 'the site I'm looking at', or name no site at all, they mean that on-screen site, and the way to reach it is: where this schema leaves site_id OPTIONAL, OMIT IT ENTIRELY — that is the primary path, not a fallback, and the turn's own surface resolves it server-side. Where the schema REQUIRES it, call page.list with `name` set to the site they named — it returns that one site's id, or the candidates to ask them about. Never pass a board, board-item, thread or any other id that merely happens to be nearby in the conversation — those name different objects and will be refused — and never one you composed.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "route": {
                    "type": "string",
                    "description": "The article's route on the site, e.g. /blog/how-we-ship. page.write_article returns it."
                  },
                  "target": {
                    "description": "Where to publish: 'native' puts the RevAStack site itself on the internet, 'byo' pushes the article to the workspace's connected WordPress or Webflow site, 'both' does each. Omit for 'native'.",
                    "type": "string",
                    "enum": [
                      "native",
                      "byo",
                      "both"
                    ]
                  },
                  "publish_live": {
                    "description": "BYO only. Leave it out or pass false to create the article as a draft on the connected site for review; true publishes it to readers immediately, which cannot be undone from here.",
                    "type": "boolean"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "route"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "route": {
                          "type": "string"
                        },
                        "native_url": {
                          "type": "string"
                        },
                        "external_id": {
                          "type": "string"
                        },
                        "external_status": {
                          "type": "string"
                        },
                        "skipped": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.publish_as_blueprint": {
      "post": {
        "operationId": "call_page_publish_as_blueprint",
        "summary": "Call page.publish_as_blueprint",
        "description": "Save one of this workspace's sites as a template to start new sites from — 'save this as a template', 'I want to reuse this layout', 'make this the starting point for the next one'. Save one of this workspace's sites as a reusable template, so new sites can be created from a copy of it with this brand's name and colours substituted in. It does NOT put anything on the internet — the site's own live address is unchanged — and it copies the site's most recent BUILT version, so a site that has never finished a build is refused. Pass blueprint_id only to update a template that already exists. Not for withdrawing a saved template — that is `page.retire_blueprint`. 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.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "description": "The SITE the member means, as a site UUID. You are NOT shown the id of the site open on screen — it never appears in your context, so there is nothing to copy. When they say 'this site', 'the site I'm looking at', or name no site at all, they mean that on-screen site, and the way to reach it is: where this schema leaves site_id OPTIONAL, OMIT IT ENTIRELY — that is the primary path, not a fallback, and the turn's own surface resolves it server-side. Where the schema REQUIRES it, call page.list with `name` set to the site they named — it returns that one site's id, or the candidates to ask them about. Never pass a board, board-item, thread or any other id that merely happens to be nearby in the conversation — those name different objects and will be refused — and never one you composed.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "description": "What the gallery calls this template. Unique within the workspace — a name already in use is refused, so ask the operator for another rather than inventing a variation."
                  },
                  "description": {
                    "description": "Optional one line on what the template is for, shown under its name.",
                    "type": "string",
                    "maxLength": 500
                  },
                  "blueprint_id": {
                    "description": "Only when UPDATING a template that already exists — the saved blueprint's UUID, from page.list with list 'templates'. This re-points it at the site's newest built version. Leave it out to save a NEW template.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "name"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "blueprint_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "name": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string"
                        },
                        "source_revision_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "updated": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.retire_blueprint": {
      "post": {
        "operationId": "call_page_retire_blueprint",
        "summary": "Call page.retire_blueprint",
        "description": "Stop offering one of this workspace's saved templates — 'retire that template', 'take that starting point off the list', 'we shouldn't use that one any more'. Stop offering one of THIS WORKSPACE's saved templates. Sites already created from it are completely unaffected and keep working; the template is only withdrawn from the list of things a new site can be created from. If it was already retired, say so rather than implying anything changed. ⚠️ page.list shows templates this workspace cannot retire — ones another workspace in the account published, and ours that ship to every account. Only call this for a row whose `retirable` is true; for any other, tell the member whose it is instead of attempting it. Not for saving a site as a template — that is `page.publish_as_blueprint`. 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.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "blueprint_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "One of this workspace's SAVED blueprints, as a UUID. page.list with list 'templates' returns them by name; a built-in template id (a slug like general-marketing) is NOT one of these and is refused."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "blueprint_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "blueprint_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "name": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string"
                        },
                        "changed": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.create_preview_link": {
      "post": {
        "operationId": "call_page_create_preview_link",
        "summary": "Call page.create_preview_link",
        "description": "Give the member a private link so they can show a site to someone before it goes live — 'send me a link I can share', 'can my client see this first?', 'I want to show someone before publishing'. Issue a shareable preview link for a page — an unguessable, expiring URL that shows one revision WITHOUT publishing it. Nothing goes live and no address changes. Give the member the whole url immediately and say when it expires: it is shown once and cannot be looked up again. If the revision is not the live one, say so. Not for letting one person past a password — that is `page.mint_access_link`. 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.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "description": "The SITE the member means, as a site UUID. You are NOT shown the id of the site open on screen — it never appears in your context, so there is nothing to copy. When they say 'this site', 'the site I'm looking at', or name no site at all, they mean that on-screen site, and the way to reach it is: where this schema leaves site_id OPTIONAL, OMIT IT ENTIRELY — that is the primary path, not a fallback, and the turn's own surface resolves it server-side. Where the schema REQUIRES it, call page.list with `name` set to the site they named — it returns that one site's id, or the candidates to ask them about. Never pass a board, board-item, thread or any other id that merely happens to be nearby in the conversation — those name different objects and will be refused — and never one you composed.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "revision": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        },
                        "expires_at": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.revoke_preview_link": {
      "post": {
        "operationId": "call_page_revoke_preview_link",
        "summary": "Call page.revoke_preview_link",
        "description": "Kill a preview link so it stops opening the site — 'cancel that share link', 'stop that link working', 'revoke the preview I sent out'. Kill a shareable preview link so it stops opening the page. Pass the token from the link — nothing stores it, so it has to come from this conversation or from the member. A link that had already expired reports the same success; say the link no longer works either way, and do not repeat the token back. Not for making a new preview link — that is `page.create_preview_link`. 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.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "description": "The SITE the member means, as a site UUID. You are NOT shown the id of the site open on screen — it never appears in your context, so there is nothing to copy. When they say 'this site', 'the site I'm looking at', or name no site at all, they mean that on-screen site, and the way to reach it is: where this schema leaves site_id OPTIONAL, OMIT IT ENTIRELY — that is the primary path, not a fallback, and the turn's own surface resolves it server-side. Where the schema REQUIRES it, call page.list with `name` set to the site they named — it returns that one site's id, or the candidates to ask them about. Never pass a board, board-item, thread or any other id that merely happens to be nearby in the conversation — those name different objects and will be refused — and never one you composed.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "token": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The token from the preview link — the last path segment of the URL, or the whole URL if that is what the operator gave you. Nothing stores it, so it must come from the conversation or from them."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "token"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "revoked": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.set_password": {
      "post": {
        "operationId": "call_page_set_password",
        "summary": "Call page.set_password",
        "description": "Put a password in front of a published site — 'password-protect this page', 'only people with the password should see it', 'lock this site down'. Put one shared password in front of a page that is already published. Anyone with the address must type it to get in. Setting or changing it immediately kills every private link and every visitor's saved unlock, so say that. Never repeat the password back in your reply, and never suggest one — use exactly what the member gave you. Not for letting one person in without the password — that is `page.mint_access_link`. 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.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "description": "The SITE the member means, as a site UUID. You are NOT shown the id of the site open on screen — it never appears in your context, so there is nothing to copy. When they say 'this site', 'the site I'm looking at', or name no site at all, they mean that on-screen site, and the way to reach it is: where this schema leaves site_id OPTIONAL, OMIT IT ENTIRELY — that is the primary path, not a fallback, and the turn's own surface resolves it server-side. Where the schema REQUIRES it, call page.list with `name` set to the site they named — it returns that one site's id, or the candidates to ask them about. Never pass a board, board-item, thread or any other id that merely happens to be nearby in the conversation — those name different objects and will be refused — and never one you composed.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "password": {
                    "type": "string",
                    "minLength": 8,
                    "maxLength": 256,
                    "description": "The password visitors will type, 8-256 characters. Use exactly what the operator gave you — never invent one, never suggest one, and do not repeat it back in your reply."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "password"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "access_version": {
                          "type": "integer"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.clear_password": {
      "post": {
        "operationId": "call_page_clear_password",
        "summary": "Call page.clear_password",
        "description": "Take the password off a site so anyone with the address can read it — 'make this page public again', 'remove the password', 'anyone should be able to see it'. Remove the password from a page, making it readable by anyone with the address. It makes the page PUBLIC: afterwards say plainly that it is now public and that every private link for it has stopped working. Not for letting one person in while keeping the password — that is `page.mint_access_link`. 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.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "description": "The SITE the member means, as a site UUID. You are NOT shown the id of the site open on screen — it never appears in your context, so there is nothing to copy. When they say 'this site', 'the site I'm looking at', or name no site at all, they mean that on-screen site, and the way to reach it is: where this schema leaves site_id OPTIONAL, OMIT IT ENTIRELY — that is the primary path, not a fallback, and the turn's own surface resolves it server-side. Where the schema REQUIRES it, call page.list with `name` set to the site they named — it returns that one site's id, or the candidates to ask them about. Never pass a board, board-item, thread or any other id that merely happens to be nearby in the conversation — those name different objects and will be refused — and never one you composed.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "access_version": {
                          "type": "integer"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.mint_access_link": {
      "post": {
        "operationId": "call_page_mint_access_link",
        "summary": "Call page.mint_access_link",
        "description": "Let one person past a site's password without telling them the password — 'let my client in without the password', 'send them a private way in', 'give this one person access'. Mint a private link that lets one person past a page's password without knowing it. Only works on a page that HAS a password. Give the member the whole url immediately and say when it expires: it is shown once and cannot be looked up again. Setting or clearing the password kills it. Not for a preview of a version that is not live — that is `page.create_preview_link`. 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.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "description": "The SITE the member means, as a site UUID. You are NOT shown the id of the site open on screen — it never appears in your context, so there is nothing to copy. When they say 'this site', 'the site I'm looking at', or name no site at all, they mean that on-screen site, and the way to reach it is: where this schema leaves site_id OPTIONAL, OMIT IT ENTIRELY — that is the primary path, not a fallback, and the turn's own surface resolves it server-side. Where the schema REQUIRES it, call page.list with `name` set to the site they named — it returns that one site's id, or the candidates to ask them about. Never pass a board, board-item, thread or any other id that merely happens to be nearby in the conversation — those name different objects and will be refused — and never one you composed.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "ttl_minutes": {
                    "description": "Optional. How many minutes the link should last. The action clamps it into the allowed range; omit for the default.",
                    "type": "integer",
                    "exclusiveMinimum": 0
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "url": {
                          "type": "string"
                        },
                        "expires_at": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/workspace_sets.create": {
      "post": {
        "operationId": "call_workspace_sets_create",
        "summary": "Call workspace_sets.create",
        "description": "Name a group of brands in this account so a command can address it later ('post this to the north america set'). Say which brands ONE way: the specific brands they picked, every brand of a business type, or every brand set up from one template. The operator sees an approve card naming the group and the brands it covers before anything is created: never say the group exists until the result says so. Requires the sharing permission (Owner/Admin by default). Not for changing a group that already exists — that is `workspace_sets.update`.\n\nEvery 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.",
        "tags": [
          "workspace_sets"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "What the operator calls this group of brands, in their words — 'North America', 'The three new locations'."
                  },
                  "selector": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "workspace_ids": {
                            "minItems": 1,
                            "type": "array",
                            "items": {
                              "type": "string"
                            },
                            "description": "Brand ids, from workspace_sets.list_brands (or workspace_sets.list, or the surface context) — never invented."
                          }
                        },
                        "required": [
                          "workspace_ids"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "company_type": {
                            "type": "string",
                            "description": "A business-type key, from assets.list_company_types — never invented."
                          }
                        },
                        "required": [
                          "company_type"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "template_links_of": {
                            "type": "string",
                            "description": "The id of the TEMPLATE brand whose set-up-from-it brands make the set."
                          }
                        },
                        "required": [
                          "template_links_of"
                        ],
                        "additionalProperties": false
                      }
                    ],
                    "description": "Exactly ONE of: {workspace_ids:[...]} the brands they picked · {company_type:'...'} every brand of that business type · {template_links_of:'<template brand id>'} every brand set up from that template."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "name",
                  "selector"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "setId": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "handle": {
                          "type": "string"
                        },
                        "selectorKind": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "handle",
                        "name",
                        "selectorKind",
                        "setId",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/workspace_sets.update": {
      "post": {
        "operationId": "call_workspace_sets_update",
        "summary": "Call workspace_sets.update",
        "description": "Change a named group of brands — 'rename that group', 'add the new brand to my north america group', 'retire that group'.  Rename a named group of brands, change which brands it covers, change the brand answer it remembers for next time, or retire it. Get the setId from workspace_sets.list. Renaming changes only what people READ — anything already pointed at the set keeps working. The operator sees an approve card naming every new value before anything changes: call it ONCE — never call it again to 'confirm', because the card is the confirmation. Requires the sharing permission (Owner/Admin by default). Not for naming a new group — that is `workspace_sets.create`. 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.\n\nEvery 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.",
        "tags": [
          "workspace_sets"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "set_id": {
                    "type": "string",
                    "description": "The id of the set to change — the setId workspace_sets.list returns."
                  },
                  "name": {
                    "description": "A new display name. Omit to keep it.",
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "selector": {
                    "anyOf": [
                      {
                        "anyOf": [
                          {
                            "type": "object",
                            "properties": {
                              "workspace_ids": {
                                "minItems": 1,
                                "type": "array",
                                "items": {
                                  "type": "string"
                                },
                                "description": "Brand ids, from workspace_sets.list_brands (or workspace_sets.list, or the surface context) — never invented."
                              }
                            },
                            "required": [
                              "workspace_ids"
                            ],
                            "additionalProperties": false
                          },
                          {
                            "type": "object",
                            "properties": {
                              "company_type": {
                                "type": "string",
                                "description": "A business-type key, from assets.list_company_types — never invented."
                              }
                            },
                            "required": [
                              "company_type"
                            ],
                            "additionalProperties": false
                          },
                          {
                            "type": "object",
                            "properties": {
                              "template_links_of": {
                                "type": "string",
                                "description": "The id of the TEMPLATE brand whose set-up-from-it brands make the set."
                              }
                            },
                            "required": [
                              "template_links_of"
                            ],
                            "additionalProperties": false
                          }
                        ],
                        "description": "Exactly ONE of: {workspace_ids:[...]} the brands they picked · {company_type:'...'} every brand of that business type · {template_links_of:'<template brand id>'} every brand set up from that template."
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "Exactly ONE of: {workspace_ids:[...]} the brands they picked · {company_type:'...'} every brand of that business type · {template_links_of:'<template brand id>'} every brand set up from that template."
                  },
                  "retired": {
                    "description": "true retires the set; false brings a retired one back.",
                    "anyOf": [
                      {
                        "type": "boolean"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "remembered_brand_treatment": {
                    "description": "The answer to remember for next time: 'regenerate' rebuilds the piece for each brand, 'as_is' uses the template content unchanged. Pass null to forget the remembered answer, so Goosy asks next time. Omit to leave the memory alone.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "regenerate",
                          "as_is"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "set_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "setId": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "handle": {
                          "type": "string"
                        },
                        "selectorKind": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/assets.list_link_updates": {
      "post": {
        "operationId": "call_assets_list_link_updates",
        "summary": "Call assets.list_link_updates",
        "description": "Say what changes are waiting on this brand's linked assets — 'is there anything to accept?', 'what's changed on the originals?', 'do I have updates waiting?'.  List the changes the ORIGINALS of this brand's linked assets have made and offered back — what is waiting on a decision, and what was already decided. Use it before assets.decide_link_update to find the updateId. Read-only. Not for taking or turning down one update — that is `assets.decide_link_update`.\n\nEvery 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.",
        "tags": [
          "assets"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "updates": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "updateId": {
                                "type": "string"
                              },
                              "linkId": {
                                "type": "string"
                              },
                              "status": {
                                "type": "string"
                              },
                              "proposedAt": {
                                "type": "string"
                              },
                              "proposedFields": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              }
                            },
                            "required": [
                              "updateId",
                              "linkId",
                              "status",
                              "proposedAt",
                              "proposedFields"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "unrecognizedCount": {
                          "type": "number"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "unrecognizedCount",
                        "updates",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/assets.list_company_types": {
      "post": {
        "operationId": "call_assets_list_company_types",
        "summary": "Call assets.list_company_types",
        "description": "Say which business types a brand can be the template for — 'what business types are there?', 'which type is this brand the template for?', 'what can I set this up as?'.  List the business types a brand can be made the template for, and say which one THIS brand is a template for today (or none). Use it before assets.designate_template to find the exact key — never invent one. Read-only. Not for making this brand a type's template — that is `assets.designate_template`.\n\nEvery 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.",
        "tags": [
          "assets"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "companyTypes": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string"
                              },
                              "label": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "key",
                              "label"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "currentCompanyTypeKey": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "companyTypes",
                        "currentCompanyTypeKey",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/shorts.compose_plan": {
      "post": {
        "operationId": "call_shorts_compose_plan",
        "summary": "Call shorts.compose_plan",
        "description": "Put together the plan of this short from the answers so far — 'show me the plan for this short', 'what will this short look like'. Draw the plan of this short from the answers so far. This makes nothing and spends nothing — a person presses Make my Short. Not for making the short — that is `shorts.make_short`.\n\nEvery 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.",
        "tags": [
          "shorts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "brief_id": {
                    "description": "The short's brief id. If this conversation has named one, pass it — a named id always wins. If none has been named and the person is on a short's plan and means that plan ('show me the plan', 'make it'), LEAVE IT OUT: the tool acts on the plan on screen. If none has been named and no plan is open, do not call this — ask which short they mean. Never invent an id.",
                    "type": "string"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "brief_id": {
                          "description": "The brief this acted on — the plan on screen when no usable id was given.",
                          "type": "string"
                        },
                        "ready": {
                          "type": "boolean",
                          "description": "False when a question is still open — then nothing is drawn."
                        },
                        "title": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "readback": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "learned": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "kind": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "length": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "ratio": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "beats": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "number": {
                                "type": "integer"
                              },
                              "name": {
                                "type": "string"
                              },
                              "line": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "seconds": {
                                "type": "integer"
                              },
                              "budget": {
                                "type": "string"
                              },
                              "made_by": {
                                "type": "string",
                                "enum": [
                                  "you",
                                  "goosy",
                                  "screen"
                                ]
                              }
                            },
                            "required": [
                              "number",
                              "name",
                              "line",
                              "seconds",
                              "budget",
                              "made_by"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "standing": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "label": {
                                "type": "string"
                              },
                              "value": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "label",
                              "value"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "open_questions": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "beats",
                        "kind",
                        "learned",
                        "length",
                        "open_questions",
                        "ratio",
                        "readback",
                        "ready",
                        "standing",
                        "title",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/shorts.compose_week": {
      "post": {
        "operationId": "call_shorts_compose_week",
        "summary": "Call shorts.compose_week",
        "description": "Put together next week's shorts — 'plan next week's shorts', 'what shorts are we making next week'. Draw next week's shorts. Ask nothing first — this IS the answer; show the person what it drew and let them change it. Not for making the week — that is `shorts.make_week`.\n\nEvery 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.",
        "tags": [
          "shorts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "description": "An existing week's board id, when re-reading one.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "week_name": {
                          "type": "string",
                          "description": "Week of Sep 14."
                        },
                        "week_start": {
                          "type": "string",
                          "description": "YYYY-MM-DD, the Monday."
                        },
                        "readback": {
                          "type": "string"
                        },
                        "learned_line": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "cards": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "number": {
                                "type": "integer"
                              },
                              "title": {
                                "type": "string"
                              },
                              "kind": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "line": {
                                "type": "string"
                              },
                              "source": {
                                "type": "string"
                              },
                              "length": {
                                "type": "string",
                                "description": "m:ss"
                              },
                              "day": {
                                "type": "string",
                                "description": "The day word — Tue."
                              }
                            },
                            "required": [
                              "number",
                              "title",
                              "kind",
                              "line",
                              "source",
                              "length",
                              "day"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "departures": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "platform": {
                                "type": "string"
                              },
                              "time": {
                                "type": "string"
                              },
                              "source": {
                                "type": "string",
                                "enum": [
                                  "learned",
                                  "default"
                                ],
                                "description": "`learned` from this workspace's own figures; `default` is a starting guess and must be SAID as one."
                              }
                            },
                            "required": [
                              "platform",
                              "time",
                              "source"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "spread": {
                          "type": "string",
                          "description": "together | rotate | test_first — how the week spreads (R12)."
                        },
                        "styles": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string"
                              },
                              "why": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "name",
                              "why"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "competitor_shapes": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "Pass this to shorts.try_shape as tile_id."
                              },
                              "hook": {
                                "type": "string"
                              },
                              "views": {
                                "type": "string",
                                "description": "A PUBLIC fact about their short."
                              },
                              "age": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "id",
                              "hook",
                              "views",
                              "age"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "shelf": {
                          "type": "string"
                        },
                        "has_rhythm": {
                          "type": "boolean"
                        },
                        "open_at": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "cards",
                        "competitor_shapes",
                        "departures",
                        "has_rhythm",
                        "learned_line",
                        "open_at",
                        "readback",
                        "shelf",
                        "spread",
                        "styles",
                        "week_name",
                        "week_start",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/shorts.read_edit": {
      "post": {
        "operationId": "call_shorts_read_edit",
        "summary": "Call shorts.read_edit",
        "description": "Read back what Goosy's edit did to a short — 'what did you change?', 'show me the edit log' — every change as a plain sentence with the id that undoes it, how long it runs now, how it ends, the sound, the three covers and the one line Goosy said about watching it back. Read this BEFORE undoing a line or picking a cover: the ids come from here. If they say 'this short' and name no id, use the id of the short whose board they are on. Not for Goosy's verdict on the cut — that is `shorts.judge_cut`.\n\nEvery 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.",
        "tags": [
          "shorts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "short_id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The short's id, as the board or a read projection gave it."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "short_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "short_id": {
                          "type": "string"
                        },
                        "edited": {
                          "type": "boolean"
                        },
                        "log": {
                          "readOnly": true,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "The log line's id — what `shorts.undo_edit` takes."
                              },
                              "sentence": {
                                "type": "string",
                                "description": "The plain past-tense sentence a person reads under the player."
                              },
                              "kind": {
                                "type": "string",
                                "description": "What the line did, in the engine's own word."
                              },
                              "beat_id": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "undoable": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "id",
                              "sentence",
                              "kind",
                              "beat_id",
                              "undoable"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "covers": {
                          "readOnly": true,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "note": {
                                "type": "string"
                              },
                              "picked": {
                                "type": "boolean"
                              },
                              "first_frame": {
                                "type": "boolean"
                              },
                              "word_above_face": {
                                "type": "boolean"
                              },
                              "drawn": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "id",
                              "note",
                              "picked",
                              "first_frame",
                              "word_above_face",
                              "drawn"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "seconds": {
                          "type": "integer"
                        },
                        "clock": {
                          "type": "string"
                        },
                        "loops": {
                          "type": "boolean"
                        },
                        "sound": {
                          "type": "string",
                          "enum": [
                            "none",
                            "bed",
                            "platform"
                          ]
                        },
                        "judge_line": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "waiting_on": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "open_at": {
                          "type": "string",
                          "description": "Where the person watches it."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "clock",
                        "covers",
                        "edited",
                        "judge_line",
                        "log",
                        "loops",
                        "open_at",
                        "seconds",
                        "short_id",
                        "sound",
                        "waiting_on",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/shorts.try_shape": {
      "post": {
        "operationId": "call_shorts_try_shape",
        "summary": "Call shorts.try_shape",
        "description": "Add one more short to next week in the shape a competitor's short is using — 'make a short like this competitor's', 'try this format for a short'. Add one more short to next week, in the shape a competitor's short is using. The shape only — the words stay the person's own. Not for the whole week — that is `shorts.compose_week`.\n\nEvery 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.",
        "tags": [
          "shorts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "tile_id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The competitor tile's id, exactly as the plan listed it."
                  },
                  "already_tried": {
                    "description": "The tile ids already tried on this plan — pass back what the last call returned.",
                    "maxItems": 5,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1
                    }
                  },
                  "board_id": {
                    "description": "An existing week's board id, when trying a shape on one.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "tile_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "shape": {
                          "type": "string"
                        },
                        "card": {
                          "type": "object",
                          "properties": {
                            "number": {
                              "type": "integer"
                            },
                            "title": {
                              "type": "string"
                            },
                            "kind": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "line": {
                              "type": "string"
                            },
                            "source": {
                              "type": "string"
                            },
                            "length": {
                              "type": "string"
                            },
                            "day": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "number",
                            "title",
                            "kind",
                            "line",
                            "source",
                            "length",
                            "day"
                          ],
                          "additionalProperties": false
                        },
                        "week_size": {
                          "type": "integer"
                        },
                        "already_tried": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          },
                          "description": "Pass this back as `already_tried` on the next try, and as `extra_shapes` when you make the week."
                        },
                        "shelf": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "already_tried",
                        "card",
                        "shape",
                        "shelf",
                        "week_size",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/shorts.feedback": {
      "post": {
        "operationId": "call_shorts_feedback",
        "summary": "Call shorts.feedback",
        "description": "Note what the member would do differently with a short — 'make the next one shorter', 'I loved this one'. Record what the member would do differently with a short — shorter, more of them on camera, or that they loved it. It teaches the next plan; nothing is published, changed or spent. Not for a long video — that is `videos.feedback`.\n\nEvery 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.",
        "tags": [
          "shorts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "unit_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The short this is about."
                  },
                  "answer": {
                    "type": "string",
                    "enum": [
                      "shorter",
                      "more_of_me",
                      "loved_it"
                    ],
                    "description": "Which of the three the member chose."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "unit_id",
                  "answer"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "unit_id": {
                          "type": "string"
                        },
                        "answer": {
                          "type": "string"
                        },
                        "learned": {
                          "type": "string"
                        },
                        "summary": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer",
                        "learned",
                        "summary",
                        "unit_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/shorts.find_beats": {
      "post": {
        "operationId": "call_shorts_find_beats",
        "summary": "Call shorts.find_beats",
        "description": "Go through the person's take for each beat of the short — 'find which beats I already filmed', 'check my footage against the beats'. Look through the person's take for each beat of the short, and flip the ones that are in it from their skeleton to the real frame. Use it after they film on their phone or drop a file in, or when they ask which beats are in their take. A beat the take does not cover STAYS a drawing and Goosy makes it — say that plainly and never describe a beat as found when it is not. Filming costs them nothing, so never suggest otherwise. Not for handing the filming to a teammate — that is `shorts.assign_filming`.\n\nEvery 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.",
        "tags": [
          "shorts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "short_id": {
                    "description": "The short's id. OMIT IT when the person means the short whose board they are on — the Film step answers it.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "short_id": {
                          "type": "string"
                        },
                        "looked": {
                          "type": "boolean"
                        },
                        "found": {
                          "type": "integer"
                        },
                        "beats_total": {
                          "type": "integer"
                        },
                        "beats": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "number": {
                                "type": "integer"
                              },
                              "name": {
                                "type": "string"
                              },
                              "found": {
                                "type": "boolean"
                              },
                              "found_at": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "line": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "id",
                              "number",
                              "name",
                              "found",
                              "found_at",
                              "line"
                            ],
                            "description": "One beat of the short, and whether the take covers it.",
                            "additionalProperties": false
                          }
                        },
                        "face_measured": {
                          "type": "boolean"
                        },
                        "note": {
                          "type": "string"
                        },
                        "open_at": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "beats",
                        "beats_total",
                        "face_measured",
                        "found",
                        "looked",
                        "note",
                        "open_at",
                        "short_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/shorts.plan_fanout": {
      "post": {
        "operationId": "call_shorts_plan_fanout",
        "summary": "Call shorts.plan_fanout",
        "description": "Draw where this short goes and when, across every platform — 'plan out where this short posts', 'schedule this across our platforms'. Draw where this short goes and when — one set across YouTube Shorts, Instagram Reels, Facebook Reels and TikTok, each in its own words. Nothing is published. Not for sending it out — that is `shorts.publish`.\n\nEvery 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.",
        "tags": [
          "shorts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "unit_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The short's id."
                  },
                  "spread": {
                    "description": "together = Everywhere today (the default) · rotate = Spread it out · test_first = TikTok first, the rest tomorrow.",
                    "type": "string",
                    "enum": [
                      "together",
                      "rotate",
                      "test_first"
                    ]
                  },
                  "hook_variant": {
                    "description": "Which hook this set goes out with. Defaults to the first one.",
                    "type": "string",
                    "enum": [
                      "primary",
                      "spare"
                    ]
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "unit_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "unit_id": {
                          "type": "string"
                        },
                        "set_id": {
                          "type": "string"
                        },
                        "short_title": {
                          "type": "string"
                        },
                        "spread": {
                          "type": "string",
                          "enum": [
                            "together",
                            "rotate",
                            "test_first"
                          ]
                        },
                        "rows": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "platform": {
                                "type": "string",
                                "description": "YouTube Shorts · Instagram Reels · Facebook Reels · TikTok."
                              },
                              "state": {
                                "type": "string"
                              },
                              "words": {
                                "type": "string"
                              },
                              "hashtags": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "when": {
                                "type": "string"
                              },
                              "refusal": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "finish_in_app": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "platform",
                              "state",
                              "words",
                              "hashtags",
                              "when",
                              "refusal",
                              "finish_in_app"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "summary": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "rows",
                        "set_id",
                        "short_title",
                        "spread",
                        "summary",
                        "unit_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/shorts.repost_with_hook": {
      "post": {
        "operationId": "call_shorts_repost_with_hook",
        "summary": "Call shorts.repost_with_hook",
        "description": "Post a short that won again with a different hook — 'repost this with the other hook', 'try this short again with a new opening'. Post a short that won again with the other hook Goosy kept — the same file, a new first two seconds. It plans the set; the person's yes still sends it. Not for retrying a destination that failed — that is `shorts.recover_row`.\n\nEvery 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.",
        "tags": [
          "shorts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "unit_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The short's id."
                  },
                  "depart_on": {
                    "description": "The day the second run goes out, YYYY-MM-DD. Optional.",
                    "type": "string"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "unit_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "unit_id": {
                          "type": "string"
                        },
                        "set_id": {
                          "type": "string"
                        },
                        "short_title": {
                          "type": "string"
                        },
                        "hook_line": {
                          "type": "string"
                        },
                        "rows": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "platform": {
                                "type": "string"
                              },
                              "when": {
                                "type": "string"
                              },
                              "words": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "platform",
                              "when",
                              "words"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "why_line": {
                          "type": "string"
                        },
                        "summary": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "hook_line",
                        "rows",
                        "set_id",
                        "short_title",
                        "summary",
                        "unit_id",
                        "why_line",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/shorts.set_covers": {
      "post": {
        "operationId": "call_shorts_set_covers",
        "summary": "Call shorts.set_covers",
        "description": "Use one of the three covers Goosy made as the one this short goes out with — 'use this one as the cover', 'set this as the thumbnail'. Use one of the three covers Goosy made for this short as the one it goes out with. Read them back with `shorts.read_edit` and use an id — never a description and never a position. Goosy picks the short's own FIRST FRAME by default, because a short's cover and its opening frame should be the same picture; if the person chooses another, say which one was the first frame. Not for a long video's thumbnail — that is `videos.set_thumbnails`.\n\nEvery 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.",
        "tags": [
          "shorts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "short_id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The short's id, as the board or a read projection gave it."
                  },
                  "cover_id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "Which of the three covers to use, by its id."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "short_id",
                  "cover_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "short_id": {
                          "type": "string"
                        },
                        "covers": {
                          "readOnly": true,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "note": {
                                "type": "string"
                              },
                              "picked": {
                                "type": "boolean"
                              },
                              "first_frame": {
                                "type": "boolean"
                              },
                              "word_above_face": {
                                "type": "boolean"
                              },
                              "drawn": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "id",
                              "note",
                              "picked",
                              "first_frame",
                              "word_above_face",
                              "drawn"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "open_at": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "covers",
                        "open_at",
                        "short_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/shorts.edit_footage": {
      "post": {
        "operationId": "call_shorts_edit_footage",
        "summary": "Call shorts.edit_footage",
        "description": "Clean up a clip the person filmed — 'edit this clip I filmed', 'cut the dead air out of my footage'. Edit a clip the person filmed: find the hook and move it to the first second, cut the dead air, put the captions under the chin, decide the sound by what the short is for, and hand back what you did as plain sentences they can undo. Use it when they have sent footage and want it edited, or when they ask you to edit it again a different way. This is Goosy's work to do: calling it raises the approval card, which is the person's confirmation, so call it on the ask. Never say the edit is done until the result says so. Not for a short Goosy drew — that is `shorts.plan_edit`. 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.\n\nEvery 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.",
        "tags": [
          "shorts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "short_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The short they filmed, as given in this conversation."
                  },
                  "direction": {
                    "description": "What they asked you to change, in their own words.",
                    "type": "string",
                    "maxLength": 600
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "short_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "short_id": {
                          "type": "string"
                        },
                        "short_name": {
                          "type": "string"
                        },
                        "job_line": {
                          "type": "string"
                        },
                        "kind_line": {
                          "type": "string"
                        },
                        "edited": {
                          "type": "boolean"
                        },
                        "log": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "sentence": {
                                "type": "string"
                              },
                              "beat": {
                                "anyOf": [
                                  {
                                    "type": "integer"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "sentence",
                              "beat"
                            ],
                            "description": "One thing Goosy did to the clip, and where.",
                            "additionalProperties": false
                          }
                        },
                        "captions": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "sound": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "beats": {
                          "type": "integer"
                        },
                        "open_at": {
                          "type": "string"
                        },
                        "note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/shorts.judge_cut": {
      "post": {
        "operationId": "call_shorts_judge_cut",
        "summary": "Call shorts.judge_cut",
        "description": "Play back Goosy's verdict on its own edit of a short — 'is this cut any good', 'how does this edit hold up'. Read back Goosy's verdict on its own edit of a short — whether the hook lands in the first second, whether it holds to the end, whether it reads with the sound off, whether anything sits on a face, and how it ends. The verdict is written when the short is edited; this reports it. Say the ONE line out loud and never a score. Not for the list of changes the edit made — that is `shorts.read_edit`. 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.\n\nEvery 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.",
        "tags": [
          "shorts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "short_id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The short's id, as the board or a read projection gave it."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "short_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "short_id": {
                          "type": "string"
                        },
                        "score": {
                          "type": "number"
                        },
                        "band": {
                          "type": "string",
                          "enum": [
                            "strong",
                            "sound",
                            "thin"
                          ]
                        },
                        "findings": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string",
                                "description": "The rubric's own name for the weakness."
                              },
                              "at": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "note": {
                                "type": "string",
                                "description": "What is wrong and what to do, in one sentence."
                              },
                              "severity": {
                                "type": "string",
                                "enum": [
                                  "blocking",
                                  "worth_fixing",
                                  "noted"
                                ]
                              }
                            },
                            "required": [
                              "key",
                              "at",
                              "note",
                              "severity"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "line": {
                          "type": "string"
                        },
                        "escalated": {
                          "type": "boolean"
                        },
                        "open_at": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/shorts.plan_edit": {
      "post": {
        "operationId": "call_shorts_plan_edit",
        "summary": "Call shorts.plan_edit",
        "description": "Edit a short — move the hook up front, cut dead air, add captions — 'edit this short', 'clean up this cut'. Edit a short: move the hook to the first second, take the dead air out, lay the captions under the chin, decide the sound and the ending, lay it down, make three covers and watch it back. This is Goosy's work to do and it does NOT start on its own — it stops first on its approval card in the chat and runs only when the person approves it there. Never say the edit is done unless the result says so. ⚠️ NEVER NAME A CREDIT, A COST OR A PRICE: it is a paid step and it asks before taking it. Not for a clip the person filmed — that is `shorts.edit_footage`. 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.\n\nEvery 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.",
        "tags": [
          "shorts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "short_id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The short's id, as the board or a read projection gave it."
                  },
                  "direction": {
                    "description": "What to change, in the person's own words. Leave it out for Goosy's first edit.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000
                  },
                  "beat_id": {
                    "description": "ONE beat's id, when the person asked about one beat rather than the whole short.",
                    "type": "string",
                    "minLength": 1
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "short_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "short_id": {
                          "type": "string"
                        },
                        "log": {
                          "readOnly": true,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "The log line's id — what `shorts.undo_edit` takes."
                              },
                              "sentence": {
                                "type": "string",
                                "description": "The plain past-tense sentence a person reads under the player."
                              },
                              "kind": {
                                "type": "string",
                                "description": "What the line did, in the engine's own word."
                              },
                              "beat_id": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "undoable": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "id",
                              "sentence",
                              "kind",
                              "beat_id",
                              "undoable"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "seconds": {
                          "type": "integer"
                        },
                        "clock": {
                          "type": "string"
                        },
                        "loops": {
                          "type": "boolean"
                        },
                        "sound": {
                          "type": "string",
                          "enum": [
                            "none",
                            "bed",
                            "platform"
                          ]
                        },
                        "honest_time": {
                          "type": "string"
                        },
                        "open_at": {
                          "type": "string",
                          "description": "Where the person watches it."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/shorts.research_pull": {
      "post": {
        "operationId": "call_shorts_research_pull",
        "summary": "Call shorts.research_pull",
        "description": "Look at what's working in short form for this short's topic — 'what's working in shorts about this topic', 'show me some inspiration'. Look at what is working in short form for this short's topic. ONE pull, run when the person asks for it. ⚠️ READ `source` BEFORE YOU NARRATE THE RESULT: `short_form_live` means these three came from a fresh look; `already_mined` means the live lookup did NOT happen and these are shorts this workspace had already mined — say so in the words `fallback_reason` gives you. A `views` or `seconds` of null means UNKNOWN, not zero. Not for which look a short could take — that is `videos.list_looks`. 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.\n\nEvery 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.",
        "tags": [
          "shorts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "brief_id": {
                    "description": "The short's brief id. If this conversation has named one, pass it — a named id always wins. If none has been named and the person is on a short's plan and means that plan ('show me the plan', 'make it'), LEAVE IT OUT: the tool acts on the plan on screen. If none has been named and no plan is open, do not call this — ask which short they mean. Never invent an id.",
                    "type": "string"
                  },
                  "scope": {
                    "type": "string",
                    "enum": [
                      "yes",
                      "topic_only"
                    ],
                    "description": "How wide to look — the person's own answer to the offer."
                  },
                  "borrow_index": {
                    "description": "Borrow ONE pick's shape, by its position in `picks` (0-based). Only when the person asked for it.",
                    "type": "integer",
                    "minimum": 0
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "scope"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "brief_id": {
                          "description": "The brief this acted on — the plan on screen when no usable id was given.",
                          "type": "string"
                        },
                        "picks": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "title": {
                                "type": "string"
                              },
                              "channel": {
                                "type": "string"
                              },
                              "views": {
                                "anyOf": [
                                  {
                                    "type": "integer",
                                    "minimum": 0
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "age": {
                                "type": "string"
                              },
                              "hook": {
                                "type": "string",
                                "description": "The hook, in one line — the SHAPE."
                              },
                              "seconds": {
                                "anyOf": [
                                  {
                                    "type": "integer",
                                    "minimum": 0
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "thumbnail_word": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "thumbnail_url": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "borrowed": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "title",
                              "channel",
                              "views",
                              "age",
                              "hook",
                              "seconds",
                              "thumbnail_word",
                              "thumbnail_url",
                              "borrowed"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "shared_shape": {
                          "type": "string"
                        },
                        "source": {
                          "type": "string",
                          "enum": [
                            "short_form_live",
                            "already_mined"
                          ],
                          "description": "`short_form_live` — a fresh look at short form. `already_mined` — what this workspace has already mined, because the live lookup did not happen."
                        },
                        "fallback_reason": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/shorts.write_beats": {
      "post": {
        "operationId": "call_shorts_write_beats",
        "summary": "Call shorts.write_beats",
        "description": "Draw this short's beats — 'write the beats for this short', 'storyboard this short' — four to six beats with their full sheets. This is a short's script and its storyboard in ONE act: there is no separate script step. Call it as well when the person wants all the beats drawn again, passing anything they said they want in the short as `wants`. It writes the WORDS and the sheets; it does NOT write the shots each beat is made from — `shorts.mint_stills` does that. Show the person what it drew, let them change it, and offer to write the shots. If they say 'this short' and name no id, call it with the id of the short whose board they are on. ⚠️ IT MAY ALSO CARRY `questions` — real facts the short needs and nobody has given (a name, the product, one number). When it does, ASK THEM AS YOUR VERY NEXT TURN, in your own words, in one message, and NEVER answer one yourself: a made-up name ships in the finished short. THIS TOOL CANNOT RECORD THEIR ANSWERS — send what they say to `videos.answer_script_facts` with the `key` it gave you, and call this one again only once the answers are recorded. The beats already carry a blank everywhere an answer belongs. Not for the shots each beat is made from — that is `shorts.mint_stills`. 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.\n\nEvery 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.",
        "tags": [
          "shorts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "short_id": {
                    "description": "The short's id. OMIT IT when the person means the short whose board they are on — the surface answers it.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "wants": {
                    "description": "One thing the PERSON said they want in this short, in their words. Omit it unless they said something.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 500
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "short_id": {
                          "type": "string"
                        },
                        "beats": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "number": {
                                "type": "integer",
                                "exclusiveMinimum": 0
                              },
                              "name": {
                                "type": "string"
                              },
                              "line": {
                                "type": "string"
                              },
                              "seconds": {
                                "type": "number"
                              },
                              "source": {
                                "type": "string",
                                "enum": [
                                  "you",
                                  "goosy",
                                  "screen"
                                ]
                              },
                              "layout": {
                                "type": "string"
                              },
                              "budget": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "number",
                              "name",
                              "line",
                              "seconds",
                              "source",
                              "layout",
                              "budget"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "seconds": {
                          "type": "number"
                        },
                        "needs_filming": {
                          "type": "boolean"
                        },
                        "drawing_pictures": {
                          "type": "boolean"
                        },
                        "open_at": {
                          "type": "string"
                        },
                        "questions": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string"
                              },
                              "ask": {
                                "type": "string"
                              },
                              "why": {
                                "type": "string"
                              },
                              "example": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "key",
                              "ask",
                              "why",
                              "example"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "questions_note": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Say this to the person, in your own words, INSTEAD of asking anything — the questions did not save. Never ask a question from `questions` in the same turn you say this."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/shorts.approve_week": {
      "post": {
        "operationId": "call_shorts_approve_week",
        "summary": "Call shorts.approve_week",
        "description": "Approve every short in this week that is ready — 'approve this week's shorts', 'yes, these can go'. Call it when the person gives that yes: it is their approval, never one you give on your own. Shorts that still need them are skipped and named. If they say 'this week' and name no id, CALL IT WITH NO ARGUMENTS: it resolves the week whose board they are on, and refuses plainly when there is none. Never ask which week before trying that. Not for making the week — that is `shorts.make_week`. 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.\n\nEvery 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.",
        "tags": [
          "shorts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "description": "The week's board id, when the person named one.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "week_name": {
                          "type": "string"
                        },
                        "approved": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "title": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "id",
                              "title"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "skipped": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "title": {
                                "type": "string"
                              },
                              "reason": {
                                "type": "string",
                                "description": "needs filming · is still being written — never a code."
                              }
                            },
                            "required": [
                              "id",
                              "title",
                              "reason"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "approved_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "summary": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/shorts.assign_filming": {
      "post": {
        "operationId": "call_shorts_assign_filming",
        "summary": "Call shorts.assign_filming",
        "description": "Pass the filming of a short to a teammate — 'have Sam film this short', 'assign this to someone on my team'. Hand the filming of a short to a teammate. They get an in-app note and an email with the beats, and the short shows on their front door as waiting on them. Calling it raises the approval card, which is the person's confirmation, so call it on the ask. Pass the teammate's NAME as the person said it; it is resolved against this workspace's members server-side. If more than one person matches, the refusal names them — ask which one rather than choosing. Not for matching footage to beats — that is `shorts.find_beats`. 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.\n\nEvery 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.",
        "tags": [
          "shorts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "short_id": {
                    "description": "The short's id. OMIT IT when the person means the short whose board they are on — the Film step answers it.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "assignee": {
                    "description": "The teammate's name, as the person said it.",
                    "type": "string",
                    "minLength": 1
                  },
                  "assignee_user_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "short_id": {
                          "type": "string"
                        },
                        "assignee_name": {
                          "type": "string"
                        },
                        "beats": {
                          "type": "integer"
                        },
                        "told": {
                          "type": "boolean"
                        },
                        "open_at": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/shorts.forget_learning": {
      "post": {
        "operationId": "call_shorts_forget_learning",
        "summary": "Call shorts.forget_learning",
        "description": "Erase one line of what Goosy has learned about their shorts — 'forget that', 'stop remembering that about our shorts'. Take one line off what Goosy has learned about their shorts, because they said to. Their memory is theirs — never argue with a forget, and never forget one they did not name. Not for a line learned about their long videos — that is `videos.forget_video_learning`. 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.\n\nEvery 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.",
        "tags": [
          "shorts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "sentence": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 400,
                    "description": "The learned line to forget, as close to word-for-word as they said it or as the brand kit shows it — 'keep it under 40 seconds', 'TikTok wins for you'. Never compose a line yourself: if you are not sure which one they mean, read what Goosy has learned back to them and ask."
                  },
                  "learnedOn": {
                    "description": "The day that line was learned, as YYYY-MM-DD. Only when a refusal told you the same line exists on more than one day — otherwise leave it out.",
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                  },
                  "source": {
                    "description": "Why that line was learned. Only when a refusal told you the same line exists from more than one source — otherwise leave it out.",
                    "type": "string",
                    "enum": [
                      "pick",
                      "edit",
                      "figures",
                      "feedback",
                      "kit"
                    ]
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "sentence"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "forgotten": {
                          "type": "boolean"
                        },
                        "sentence": {
                          "type": "string"
                        },
                        "href": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/shorts.recover_row": {
      "post": {
        "operationId": "call_shorts_recover_row",
        "summary": "Call shorts.recover_row",
        "description": "Give one destination another try after it failed — 'try posting to TikTok again', 'retry the one that failed'. Try ONE destination again after it failed. The ones that already went out are never touched, and a row that may already be up is refused rather than posted twice. Not for reposting a winner with a new hook — that is `shorts.repost_with_hook`. 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.\n\nEvery 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.",
        "tags": [
          "shorts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "unit_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The short's id."
                  },
                  "platform": {
                    "type": "string",
                    "enum": [
                      "youtube",
                      "instagram",
                      "facebook",
                      "tiktok"
                    ],
                    "description": "The one destination to try again."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "unit_id",
                  "platform"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "unit_id": {
                          "type": "string"
                        },
                        "platform": {
                          "type": "string"
                        },
                        "outcome": {
                          "type": "string"
                        },
                        "link": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "note": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "attempts": {
                          "type": "number"
                        },
                        "summary": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/shorts.undo_edit": {
      "post": {
        "operationId": "call_shorts_undo_edit",
        "summary": "Call shorts.undo_edit",
        "description": "Undo one line of Goosy's edit — 'undo that last change', 'put that part back the way it was'. Take ONE line of Goosy's edit back and lay that part of the short down again. Read the log with `shorts.read_edit` first and use the id it gives — never a line number and never the sentence. The line stays in the log, struck through, so the person can see what they changed their mind about. Not for editing the whole short again — that is `shorts.plan_edit`. 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.\n\nEvery 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.",
        "tags": [
          "shorts"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "short_id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The short's id, as the board or a read projection gave it."
                  },
                  "log_entry_id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The log line to undo, by the id the edit log gave it."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "short_id",
                  "log_entry_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "short_id": {
                          "type": "string"
                        },
                        "undone": {
                          "type": "string"
                        },
                        "log": {
                          "readOnly": true,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "The log line's id — what `shorts.undo_edit` takes."
                              },
                              "sentence": {
                                "type": "string",
                                "description": "The plain past-tense sentence a person reads under the player."
                              },
                              "kind": {
                                "type": "string",
                                "description": "What the line did, in the engine's own word."
                              },
                              "beat_id": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "undoable": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "id",
                              "sentence",
                              "kind",
                              "beat_id",
                              "undoable"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "seconds": {
                          "type": "integer"
                        },
                        "clock": {
                          "type": "string"
                        },
                        "relaying": {
                          "type": "boolean"
                        },
                        "open_at": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/video_unit.ship_status": {
      "post": {
        "operationId": "call_video_unit_ship_status",
        "summary": "Call video_unit.ship_status",
        "description": "Check one video unit's Ship step — 'what's left before this video can go out', 'is this video ready to ship'. Read one video unit's Ship step — which destinations it is going to, and which destination-metadata fields are still unanswered, with the field ids. Use it to tell someone what is left before this video can go out. You cannot ship it: handing off, starting a new version, marking it final and publishing are theirs to do on the Ship screen. Not for choosing the destinations — that is `video_unit.set_destinations`. If they mean the video they are looking at and name no id, CALL IT WITH NO video_unit_id: it resolves the video whose page the question was asked on, and refuses plainly when there is none. Never ask which video, and never say a video is out of reach, before trying that.\n\nEvery 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.",
        "tags": [
          "video_unit"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "video_unit_id": {
                    "description": "The video unit, as a UUID. Take it from the conversation's context — never invent one. OMIT it when the person is looking at the video and means that one: the tool resolves the unit whose page the question was asked on, and refuses plainly when there is none. Never ask which video before trying that.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "video_unit_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "video_title": {
                          "type": "string"
                        },
                        "destination_keys": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "no_destination": {
                          "type": "boolean"
                        },
                        "metadata_requests": {
                          "maxItems": 40,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "surface_label": {
                                "type": "string"
                              },
                              "placement": {
                                "type": "string"
                              },
                              "field_label": {
                                "type": "string"
                              },
                              "answered": {
                                "type": "boolean"
                              },
                              "source": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "id",
                              "surface_label",
                              "placement",
                              "field_label",
                              "answered",
                              "source"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "more_metadata_requests": {
                          "type": "boolean"
                        },
                        "metadata_total": {
                          "type": "integer"
                        },
                        "metadata_written": {
                          "type": "integer"
                        },
                        "metadata_seeded": {
                          "type": "integer"
                        },
                        "metadata_edited": {
                          "type": "integer"
                        },
                        "metadata_unanswered": {
                          "type": "integer"
                        },
                        "metadata_written_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "partial_reads": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "destination_keys",
                        "metadata_edited",
                        "metadata_requests",
                        "metadata_seeded",
                        "metadata_total",
                        "metadata_unanswered",
                        "metadata_written",
                        "metadata_written_at",
                        "more_metadata_requests",
                        "no_destination",
                        "partial_reads",
                        "video_title",
                        "video_unit_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/video_unit.set_script_mode": {
      "post": {
        "operationId": "call_video_unit_set_script_mode",
        "summary": "Call video_unit.set_script_mode",
        "description": "Toggle a video unit between the full-script view and the outline view — 'show me the outline instead', 'switch to the full script view'. Switch a video unit between the full-script view and the outline view. There is ONE script behind both views — switching converts nothing and discards nothing, so say that plainly rather than implying a rewrite. Not for changing the script's words — that is `script.save`. If they mean the video they are looking at and name no id, CALL IT WITH NO video_unit_id: it resolves the video whose page the question was asked on, and refuses plainly when there is none. Never ask which video, and never say a video is out of reach, before trying that.\n\nEvery 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.",
        "tags": [
          "video_unit"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "video_unit_id": {
                    "description": "The video unit, as a UUID. Take it from the conversation's context — never invent one. OMIT it when the person is looking at the video and means that one: the tool resolves the unit whose page the question was asked on, and refuses plainly when there is none. Never ask which video before trying that.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "mode": {
                    "type": "string",
                    "enum": [
                      "script",
                      "outline"
                    ],
                    "description": "`script` for the full-script view, `outline` for the beat outline. ONE script model, two views — switching does not convert or discard anything."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "mode"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "video_unit_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "mode": {
                          "type": "string",
                          "enum": [
                            "script",
                            "outline"
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "mode",
                        "video_unit_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/video_unit.set_destinations": {
      "post": {
        "operationId": "call_video_unit_set_destinations",
        "summary": "Call video_unit.set_destinations",
        "description": "Record where a video unit will ship — 'ship this to YouTube and TikTok', 'this one isn't going anywhere' — the destination keys the operator chose, or an explicit 'no destination' finish. Do this BEFORE copy.draft, which refuses while no destinations are chosen. The result lists the destinations that were ACCEPTED; if one you asked for is missing, say so rather than claiming it was set. Not for writing the copy for those destinations — that is `copy.draft`. If they mean the video they are looking at and name no id, CALL IT WITH NO video_unit_id: it resolves the video whose page the question was asked on, and refuses plainly when there is none. Never ask which video, and never say a video is out of reach, before trying that.\n\nEvery 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.",
        "tags": [
          "video_unit"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "video_unit_id": {
                    "description": "The video unit, as a UUID. Take it from the conversation's context — never invent one. OMIT it when the person is looking at the video and means that one: the tool resolves the unit whose page the question was asked on, and refuses plainly when there is none. Never ask which video before trying that.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "destination_keys": {
                    "maxItems": 32,
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "The destination keys to ship to. Use the keys the Ship step offers for this workspace — a key that is not available is refused server-side with the catalog's own reason."
                  },
                  "no_destination": {
                    "type": "boolean",
                    "description": "True only when the operator is deliberately finishing this video with NO destination. Otherwise false."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "destination_keys",
                  "no_destination"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "video_unit_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "destination_keys": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "no_destination": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "destination_keys",
                        "no_destination",
                        "video_unit_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/units.add_to_board": {
      "post": {
        "operationId": "call_units_add_to_board",
        "summary": "Call units.add_to_board",
        "description": "Put this video unit on a board, linked as a reference — 'add this video to that board', 'put this on the board as a reference'. Add THIS video unit to a board, linked as a reference. The unit stays where it is — nothing is copied or moved, and the board does not become its owner. When the member asked for it themselves it runs; otherwise they see an approve card first. Not for landing the video on a course or project as its home: that is the Approve step's own 'Where it saves' question, answered on the Approve page, not a verb. Never say it is done unless the result says it is.\n\nEvery 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.",
        "tags": [
          "units"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "unit_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The video unit to add, as a UUID. Take it from the conversation's context — never invent one."
                  },
                  "board_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The board to add it to, as a UUID. Ask the operator which board if they have not named one; never guess."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "unit_id",
                  "board_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "unit_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "board_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "board_item_id": {
                          "type": "string"
                        },
                        "role": {
                          "type": "string",
                          "const": "reference"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "board_id",
                        "board_item_id",
                        "role",
                        "unit_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/copy.draft": {
      "post": {
        "operationId": "call_copy_draft",
        "summary": "Call copy.draft",
        "description": "Write and save the destination copy for every place this video is set to ship — 'write the titles and descriptions for this video', 'draft the copy for YouTube and TikTok'. Write the destination copy (titles, descriptions, tags, …) for every destination this video unit is set to ship to, and save it. The destinations must already be chosen — if none are, this refuses and the operator picks them on the Ship step first. Fields the operator edited by hand are left alone. Calling it raises the approval card, which is the operator's confirmation, so call it on the ask. Not for choosing where the video ships — that is `video_unit.set_destinations`. 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.\n\nEvery 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.",
        "tags": [
          "copy"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "video_unit_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The video unit whose destination copy should be written, as a UUID. Take it from the conversation's context — never invent one."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "video_unit_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "video_unit_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "fields_written": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/intro_outro_library.list": {
      "post": {
        "operationId": "call_intro_outro_library_list",
        "summary": "Call intro_outro_library.list",
        "description": "Say which intro, outro and sting clips this brand has — 'what intros do I have?', 'which outro is the main one?', 'did my sting upload?'.  Read the intro, outro and sting clips on Settings → Brand → Intros & outros, including which is primary for each kind and whether a file actually finished uploading. You cannot upload, rename or delete one. Not for the brand's visual kit — that is `brand_kit_visual.read`.\n\nEvery 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.",
        "tags": [
          "intro_outro_library"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "assets": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "category": {
                                "type": "string"
                              },
                              "display_name": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "is_primary": {
                                "type": "boolean"
                              },
                              "mime_type": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "byte_size": {
                                "anyOf": [
                                  {
                                    "type": "integer"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "file_attached": {
                                "type": "boolean"
                              },
                              "created_at": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "id",
                              "category",
                              "display_name",
                              "is_primary",
                              "mime_type",
                              "byte_size",
                              "file_attached",
                              "created_at"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "total": {
                          "type": "integer"
                        },
                        "truncated": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "assets",
                        "total",
                        "truncated",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/brand_profile.status": {
      "post": {
        "operationId": "call_brand_profile_status",
        "summary": "Call brand_profile.status",
        "description": "Say how much of the brand profile is filled in — 'is my brand profile done?', 'why isn't my brand voice being used?', 'what's missing from my profile?'.  Read which brand-profile sections this workspace has filled in, the profile's status, and whether a booking contact is set. Use it before telling anyone why their brand voice is or is not being applied. You cannot edit a section. Not for the brand's visual kit — that is `brand_kit_visual.read`.\n\nEvery 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.",
        "tags": [
          "brand_profile"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "profile_exists": {
                          "type": "boolean"
                        },
                        "display_name": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "status": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "sections": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string"
                              },
                              "filled": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "key",
                              "filled"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "sections_filled": {
                          "type": "integer"
                        },
                        "sections_total": {
                          "type": "integer"
                        },
                        "booking_link": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "booking_contact_email_set": {
                          "type": "boolean"
                        },
                        "booking_contact_phone_set": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "booking_contact_email_set",
                        "booking_contact_phone_set",
                        "booking_link",
                        "display_name",
                        "profile_exists",
                        "sections",
                        "sections_filled",
                        "sections_total",
                        "status",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/assistant_settings.status": {
      "post": {
        "operationId": "call_assistant_settings_status",
        "summary": "Call assistant_settings.status",
        "description": "Say how the assistant is set up for this account — 'why is Goosy behaving like this?', 'what instructions does it have?', 'what are my assistant settings?'.  Read which agents this account has standing instructions for (not the wording) and the assistant preferences in effect, with the layer each value came from. Use it to explain why the assistant is behaving as it is. You cannot change an instruction or a preference. Not for the member's own look and tier — that is `shell.describe_settings`.",
        "tags": [
          "assistant_settings"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {},
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` whenever the call did not succeed, including when the tool itself returned a typed `ok: false` — this tool runs at account level, so there is no workspace boundary to distinguish. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "agents": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "agent_key": {
                                "type": "string"
                              },
                              "label": {
                                "type": "string"
                              },
                              "instructions_set": {
                                "type": "boolean"
                              },
                              "instructions_length": {
                                "type": "integer"
                              }
                            },
                            "required": [
                              "agent_key",
                              "label",
                              "instructions_set",
                              "instructions_length"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "agents_instructed": {
                          "type": "integer"
                        },
                        "preferences": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string"
                              },
                              "value": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "number"
                                  },
                                  {
                                    "type": "boolean"
                                  }
                                ]
                              },
                              "source_layer": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "key",
                              "value",
                              "source_layer"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "preferences_are_defaults": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "ok",
                        "agents",
                        "agents_instructed",
                        "preferences",
                        "preferences_are_defaults"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/notification_settings.status": {
      "post": {
        "operationId": "call_notification_settings_status",
        "summary": "Call notification_settings.status",
        "description": "Say what notifications this person gets and where — 'why didn't I get an email?', 'what am I subscribed to?', 'how am I being notified?'.  Read which notifications this person receives on which channels, their digest choice, and whether they may change the account defaults. Use it before telling anyone why they did or did not get an email. You cannot change a preference. Not for turning a notification on or off — that is `notification_preference.set`.\n\nEvery 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.",
        "tags": [
          "notification_settings"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "groups": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string"
                              },
                              "label": {
                                "type": "string"
                              },
                              "channels_enabled": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              }
                            },
                            "required": [
                              "key",
                              "label",
                              "channels_enabled"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "digest_choice": {
                          "type": "string"
                        },
                        "account_email_set": {
                          "type": "boolean"
                        },
                        "can_edit_defaults": {
                          "type": "boolean"
                        },
                        "can_edit_account_email": {
                          "type": "boolean"
                        },
                        "read_error": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "account_email_set",
                        "can_edit_account_email",
                        "can_edit_defaults",
                        "digest_choice",
                        "groups",
                        "read_error",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/notification_preference.set": {
      "post": {
        "operationId": "call_notification_preference_set",
        "summary": "Call notification_preference.set",
        "description": "Turn the member's own recurring messages and notifications on or off: the weekly digest of their planned week, Goosy's check-ins, approvals, failed publishes — 'mute the digest of my planned week', 'stop Goosy's progress nudges', 'I want a text when something needs me'. Turns one of the signed-in person's OWN notification groups on or off for one channel, for the whole account or just the current workspace; the group and its channel are in `kind_group_key`'s description, and `notification_settings.status` lists every group. It never changes what anyone else receives, and never changes the account-wide default. Not for the Monday briefing Goosy writes for the account — that is `briefing.set` — for how often Goosy checks in across the account, which is `assistant_preference.set`, or for reading what they get today, which is `notification_settings.status`.\n\nEvery 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.",
        "tags": [
          "notification_preference"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "kind_group_key": {
                    "type": "string",
                    "maxLength": 120,
                    "description": "The notification group to change: `cadence_digest` for the weekly digest of the planned week (channel `digest`), `goosy_checkins` for Goosy's own check-ins and nudges in the pane (channel `in_app`), or another key `notification_settings.status` lists. The database's own foreign key refuses an unknown one rather than guessing."
                  },
                  "channel": {
                    "type": "string",
                    "enum": [
                      "in_app",
                      "email",
                      "digest",
                      "sms"
                    ],
                    "description": "Which delivery channel this preference is about."
                  },
                  "enabled": {
                    "type": "boolean",
                    "description": "true to receive this group on this channel; false to stop."
                  },
                  "workspace_scoped": {
                    "description": "true to set the preference for the CURRENT workspace only; leave it out for the whole account. The workspace itself is resolved from the session, never passed.",
                    "type": "boolean"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "kind_group_key",
                  "channel",
                  "enabled"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "kind_group_key": {
                          "type": "string"
                        },
                        "channel": {
                          "type": "string"
                        },
                        "enabled": {
                          "type": "boolean"
                        },
                        "workspace_scoped": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "channel",
                        "enabled",
                        "kind_group_key",
                        "workspace_scoped",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/generation_defaults.set": {
      "post": {
        "operationId": "call_generation_defaults_set",
        "summary": "Call generation_defaults.set",
        "description": "Set what new work starts from by default — 'make vertical the default for videos', 'new emails should start as newsletters', 'change the default thumbnail style'.  Set ONE of the workspace's generation defaults — the video format, render mode, thumbnail profile or email type new work starts from. Admin only; the action refuses anyone below that role. It changes what LATER generations start from and starts none itself. Not for a lasting preference in the operator's own words — that is `taste_note.add`.\n\nEvery 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.",
        "tags": [
          "generation_defaults"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "field": {
                    "type": "string",
                    "enum": [
                      "videoFormat",
                      "renderMode",
                      "thumbnailProfile",
                      "emailType"
                    ],
                    "description": "Which generation default to set."
                  },
                  "value": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 200
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "The value to set, taken VERBATIM from an option the defaults page listed for this knob — never invented, never a plausible-looking guess. The write path does NOT check the value against a catalogue: whatever is passed is trimmed and stored as the workspace's default, so a wrong value is saved rather than refused. Ask the operator which listed option they mean when you are not certain. Pass null to clear the knob and fall back to the built-in."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "field",
                  "value"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "field": {
                          "type": "string"
                        },
                        "value": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "field",
                        "value",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/taste_note.add": {
      "post": {
        "operationId": "call_taste_note_add",
        "summary": "Call taste_note.add",
        "description": "Write down a lasting preference the member just told you — 'remember we never use stock photos', 'always keep captions under two lines', 'we don't say growth hacking'.  Record one durable taste note for the workspace, in the operator's own words. Taste notes are frozen once written and shape every later generation, so only write what the operator actually said — never a paraphrase, never an inference. A blank note, or one repeating something the workspace already said, is dropped and comes back as written: 0; say so rather than claiming it landed. Not for retiring a note — that is `taste_note.set_active`.\n\nEvery 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.",
        "tags": [
          "taste_note"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "scope": {
                    "type": "string",
                    "enum": [
                      "general",
                      "script",
                      "vsl_script",
                      "title",
                      "description",
                      "thumbnail"
                    ],
                    "description": "What the note is about — 'general' when it is about the brand's work as a whole."
                  },
                  "sentiment": {
                    "type": "string",
                    "enum": [
                      "worked",
                      "didnt_work",
                      "could_be_better"
                    ],
                    "description": "Whether this worked, did not work, or could be better."
                  },
                  "note": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000,
                    "description": "The note in the OPERATOR'S OWN WORDS. A taste note is frozen once written and shapes every later generation, so never paraphrase and never invent one — write what they said."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "scope",
                  "sentiment",
                  "note"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "written": {
                          "type": "number"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "written",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/taste_note.set_active": {
      "post": {
        "operationId": "call_taste_note_set_active",
        "summary": "Call taste_note.set_active",
        "description": "Retire a taste note or bring one back — 'we don't need that rule any more', 'stop applying that preference', 'bring that note back'.  Retire a taste note, or bring a retired one back. Retiring is the removal gesture: the note's words stay readable because they shaped real generations, they simply stop reaching new ones. Nothing is deleted. Not for writing a new note — that is `taste_note.add`.\n\nEvery 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.",
        "tags": [
          "taste_note"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "note_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The taste note to retire or bring back."
                  },
                  "is_active": {
                    "type": "boolean",
                    "description": "false retires the note — its words stay readable, they simply stop reaching new generations. true brings it back."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "note_id",
                  "is_active"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "note_id": {
                          "type": "string"
                        },
                        "is_active": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "is_active",
                        "note_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/writing_voices.list": {
      "post": {
        "operationId": "call_writing_voices_list",
        "summary": "Call writing_voices.list",
        "description": "See this brand's writing voices — 'what writing voices do we have', 'show me our alternate voices'. List this brand's writing voices — the house voice used unless another is picked, then the named alternates. Each alternate states only what it changes about the house voice and inherits the rest, so never describe one as a complete voice. Call this before saving or removing a voice; its ids are the only valid ones. Not for changing the house voice itself — that is `brand_kit.suggest`.\n\nEvery 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.",
        "tags": [
          "writing_voices"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "default_voice": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string"
                            },
                            "note": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "name",
                            "note"
                          ],
                          "description": "The house voice used unless another is picked. It has NO id: it is the brand record itself, not a registry row, and it cannot be edited or deleted through these tools.",
                          "additionalProperties": false
                        },
                        "voices": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "name": {
                                "type": "string"
                              },
                              "note": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "overrides": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              }
                            },
                            "required": [
                              "id",
                              "name",
                              "note",
                              "overrides"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "default_voice",
                        "voices",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/writing_voices.save": {
      "post": {
        "operationId": "call_writing_voices_save",
        "summary": "Call writing_voices.save",
        "description": "Save a new writing voice, or update one that already exists — 'save this as a new writing voice', 'update our casual voice'. Create or update one NAMED writing voice — an alternate to the house voice, stating only what it changes. Omit voice_id to create; pass one from writing_voices.list to update. Never restate the house voice: anything left unstated is inherited. The member sees an approve card for it before it runs; never say it is saved unless the result says it is. Not for removing a voice — that is `writing_voices.delete`. 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.\n\nEvery 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.",
        "tags": [
          "writing_voices"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "voice_id": {
                    "description": "Omit to CREATE a new voice; pass an id from writing_voices.list to update that one.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 60,
                    "description": "What this voice is called — the label it is picked by. Unique within the workspace."
                  },
                  "note": {
                    "description": "When to use this voice, in one line. An empty string clears it; omit it to leave it alone.",
                    "type": "string",
                    "maxLength": 500
                  },
                  "delta": {
                    "type": "object",
                    "properties": {
                      "one_liner": {
                        "description": "This voice in one line — what changes versus the house voice. An empty string clears it; omit it to leave it alone.",
                        "type": "string",
                        "maxLength": 2000
                      },
                      "tone_primary": {
                        "description": "The tone words this voice leads with (e.g. urgent, direct). Omit to leave the stored list alone; pass an empty array to clear it.",
                        "maxItems": 50,
                        "type": "array",
                        "items": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 240
                        }
                      },
                      "rules_md": {
                        "description": "Free-text rules for this voice, in the operator's own words. An empty string clears it; omit it to leave it alone.",
                        "type": "string",
                        "maxLength": 20000
                      },
                      "traits": {
                        "description": "The voice-trait table, REPLACED WHOLE when passed — a trait is a row, not a bag of fields, so send the complete list you want or omit it entirely. An empty array clears it.",
                        "maxItems": 24,
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "trait": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 240
                            },
                            "we_are": {
                              "type": "string",
                              "maxLength": 240
                            },
                            "we_are_not": {
                              "type": "string",
                              "maxLength": 240
                            },
                            "sounds_like": {
                              "type": "string",
                              "maxLength": 2000
                            }
                          },
                          "required": [
                            "trait"
                          ],
                          "additionalProperties": false
                        }
                      },
                      "tone_spectrum": {
                        "description": "Tone by SITUATION, REPLACED WHOLE when passed — same rule as traits. An empty array clears it.",
                        "maxItems": 24,
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "situation": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 240
                            },
                            "tone": {
                              "type": "string",
                              "maxLength": 240
                            },
                            "example_opener": {
                              "type": "string",
                              "maxLength": 2000
                            }
                          },
                          "required": [
                            "situation"
                          ],
                          "additionalProperties": false
                        }
                      }
                    },
                    "description": "What this voice states DIFFERENTLY from the house voice. Anything left unstated is INHERITED from the house voice at generation time — that is the point of a named voice, so never restate the house voice here.",
                    "additionalProperties": false
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "name"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "note": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "created": {
                          "type": "boolean",
                          "description": "true when this call created a new voice."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/writing_voices.delete": {
      "post": {
        "operationId": "call_writing_voices_delete",
        "summary": "Call writing_voices.delete",
        "description": "Delete one named writing voice — 'delete this writing voice', 'remove our casual voice'. Remove one NAMED writing voice. This is permanent — the voice is deleted, not retired, and past work keeps only a snapshot of its name. The house voice has no id here and cannot be removed. Prepares the removal for the operator to approve; never say it is gone until they have. Not for changing what a voice says — that is `writing_voices.save`. 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.\n\nEvery 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.",
        "tags": [
          "writing_voices"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "voice_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The writing voice's id, taken from a writing_voices.list result — never invented."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "voice_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/briefing.read": {
      "post": {
        "operationId": "call_briefing_read",
        "summary": "Call briefing.read",
        "description": "Read the member their weekly briefing — 'what's my briefing say?', 'how was the week?', 'what should I be looking at?'.  Read this workspace's weekly briefing — the headline, the story, what went well, what to watch, and the moves it proposed. Call this before answering any question about the week's briefing or what it suggested; never guess it, and never invent a number it does not carry. Not for last week's raw numbers — that is `week_metrics.read` — or for whether the briefing is on and when it comes, which is `assistant_settings.status`.\n\nEvery 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.",
        "tags": [
          "briefing"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "week_of": {
                    "description": "A date inside the week to read (YYYY-MM-DD). Omit for this week.",
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "week_of": {
                          "type": "string"
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "ready",
                            "generating",
                            "failed",
                            "none"
                          ]
                        },
                        "headline": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "story": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "highlights": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "title": {
                                "type": "string"
                              },
                              "detail": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "title",
                              "detail"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "watch_outs": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "title": {
                                "type": "string"
                              },
                              "detail": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "title",
                              "detail"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "next_moves": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "suggestion_key": {
                                "type": "string"
                              },
                              "title": {
                                "type": "string"
                              },
                              "detail": {
                                "type": "string"
                              },
                              "evidence": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "suggestion_key",
                              "title",
                              "detail",
                              "evidence"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "other_weeks": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "week_of": {
                                "type": "string"
                              },
                              "headline": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "week_of",
                              "headline"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "timezone_assumed": {
                          "type": "boolean"
                        },
                        "timezone": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "headline",
                        "highlights",
                        "next_moves",
                        "other_weeks",
                        "state",
                        "story",
                        "timezone",
                        "timezone_assumed",
                        "watch_outs",
                        "week_of",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/briefing.regenerate": {
      "post": {
        "operationId": "call_briefing_regenerate",
        "summary": "Call briefing.regenerate",
        "description": "Write the briefing again from scratch — 'redo my briefing', 'that briefing is out of date, refresh it', 'write this week's one again'.  Rewrite a briefing from scratch — this week's by default, or a past week's when week_of names one. Use it only when the person explicitly asks for a fresh one — it is limited to once a day per workspace, and the briefing already refreshes on its own every Monday. Not for reading the briefing as it stands — that is `briefing.read`. 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.\n\nEvery 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.",
        "tags": [
          "briefing"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "week_of": {
                    "description": "A date inside the week (YYYY-MM-DD). Omit for this week.",
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "enum": [
                                "ready",
                                "failed"
                              ]
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "week_of": {
                          "type": "string"
                        },
                        "headline": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/suggestion.act": {
      "post": {
        "operationId": "call_suggestion_act",
        "summary": "Call suggestion.act",
        "description": "Record that the member wants to do one of the briefing's suggested moves — 'yes, let's do that one', 'I'll take that suggestion', 'do the thing the briefing suggested'.  Record that the person wants to DO one of the briefing's suggested moves. It logs the decision — which next week's briefing reads, so it stops re-proposing what they already handled — and hands you the move's own words. Doing the work itself is the relevant capability's own tool; this never publishes, spends or changes anything on its own. Not for turning a suggestion down — that is `suggestion.dismiss`.\n\nEvery 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.",
        "tags": [
          "suggestion"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "suggestion_key": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_]{2,64}$",
                    "description": "The suggestion_key from the briefing's next_moves. It names the MOVE, not its position — read the briefing first and use the key it carries verbatim."
                  },
                  "week_of": {
                    "description": "A date inside the week (YYYY-MM-DD). Omit for this week.",
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "suggestion_key"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "suggestion_key": {
                          "type": "string"
                        },
                        "verdict": {
                          "type": "string",
                          "enum": [
                            "do_it",
                            "not_now"
                          ]
                        },
                        "title": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "detail": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "proposal_opened": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "detail",
                        "proposal_opened",
                        "suggestion_key",
                        "title",
                        "verdict",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/suggestion.dismiss": {
      "post": {
        "operationId": "call_suggestion_dismiss",
        "summary": "Call suggestion.dismiss",
        "description": "Record that the member does not want one of the briefing's suggested moves — 'not that one', 'skip that suggestion', 'stop suggesting that'.  Record that the person does NOT want one of the briefing's suggested moves right now. Next week's briefing reads this and stops proposing it unless the situation behind it genuinely changes. Not for taking a suggestion up — that is `suggestion.act`.\n\nEvery 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.",
        "tags": [
          "suggestion"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "suggestion_key": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_]{2,64}$",
                    "description": "The suggestion_key from the briefing's next_moves. It names the MOVE, not its position — read the briefing first and use the key it carries verbatim."
                  },
                  "week_of": {
                    "description": "A date inside the week (YYYY-MM-DD). Omit for this week.",
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "suggestion_key"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "suggestion_key": {
                          "type": "string"
                        },
                        "verdict": {
                          "type": "string",
                          "enum": [
                            "do_it",
                            "not_now"
                          ]
                        },
                        "title": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "detail": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "proposal_opened": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "detail",
                        "proposal_opened",
                        "suggestion_key",
                        "title",
                        "verdict",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/goal.read": {
      "post": {
        "operationId": "call_goal_read",
        "summary": "Call goal.read",
        "description": "Say what the member is aiming for — 'what are my targets?', 'what's the goal for leads?', 'am I tracking against anything?'.  Read this workspace's metric targets — what it is aiming for and over what period. This is the ONLY place a goal's number comes from: call it before you state, confirm or compare against any goal, every turn, and never answer from a number mentioned earlier in the conversation. Never assume a goal exists. Not for how the metric is actually doing — that is `analytics.query_metrics`.\n\nEvery 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.",
        "tags": [
          "goal"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "goals": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "metric": {
                                "type": "string"
                              },
                              "metric_key": {
                                "type": "string"
                              },
                              "period": {
                                "type": "string",
                                "enum": [
                                  "week",
                                  "month"
                                ]
                              },
                              "target": {
                                "type": "number"
                              }
                            },
                            "required": [
                              "metric",
                              "metric_key",
                              "period",
                              "target"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "goals",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/goal.set": {
      "post": {
        "operationId": "call_goal_set",
        "summary": "Call goal.set",
        "description": "Set the target this brand is aiming for on one metric — 'I want 50 leads a month', 'aim for 5 posts published a week', 'change my goal to 200 visitors a week'. A target the metric already has is replaced, and the weekly briefing measures progress against it. Call it every time a change is asked for, even when you believe that value is already in force: this tool returning is the only thing that makes it done, so never report a goal as set, or as already set, without having called it or `goal.read`. Not for reading the targets — that is `goal.read`; not for how much Goosy suggests or does on its own, such as the most posts it may propose in a week — that is `workspace_autonomy.set`.\n\nEvery 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.",
        "tags": [
          "goal"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "metric_key": {
                    "type": "string",
                    "description": "The metric to set a target for. Use a key from goal.read, or ask the person which metric they mean — never invent one."
                  },
                  "target": {
                    "type": "number",
                    "exclusiveMinimum": 0,
                    "description": "The target value, in the metric's own unit. Must be above 0."
                  },
                  "period": {
                    "type": "string",
                    "enum": [
                      "week",
                      "month"
                    ],
                    "description": "Whether the target is per week or per month."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "metric_key",
                  "target",
                  "period"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "metric": {
                          "type": "string"
                        },
                        "metric_key": {
                          "type": "string"
                        },
                        "period": {
                          "type": "string",
                          "enum": [
                            "week",
                            "month"
                          ]
                        },
                        "target": {
                          "type": "number"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "metric",
                        "metric_key",
                        "period",
                        "target",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/contact.get": {
      "post": {
        "operationId": "call_contact_get",
        "summary": "Call contact.get",
        "description": "Say what we know about one customer — 'who is this lead?', 'what's the story with that contact?', 'have we talked to them before?'.  Read one customer's record — who they are, which ways exist to reach them, their tags, whether we may message them, and their recent history. Address them by their id, or by ONE key you already hold from the conversation (an email, a phone number, a Messenger id). It deliberately returns no addresses or phone numbers, and there is no way to list customers with it. The summary is small on purpose; ask for section timeline or notes when it says more exists. Not for writing on their record — that is `contact.note`.\n\nEvery 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.",
        "tags": [
          "contact"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "contact_id": {
                    "description": "The customer to read, when you already have their id. Give EXACTLY ONE address: this customer id, or the identity pair (identity_kind WITH identity_value). Neither, or both together, is refused rather than guessed at.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "identity_kind": {
                    "type": "string",
                    "enum": [
                      "email",
                      "phone",
                      "meta_psid",
                      "ig_id",
                      "ghl_contact_id",
                      "gbp_reviewer"
                    ],
                    "description": "Which kind of key this is: an email address, a phone number, a Messenger id (meta_psid), an Instagram id (ig_id), a CRM record id (ghl_contact_id), or a Google reviewer id."
                  },
                  "identity_value": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 512,
                    "description": "The key exactly as you observed it. It is normalised before it is looked up, so capitals in an address are fine — but a phone number without its country code cannot be matched and will be refused rather than guessed at."
                  },
                  "identity_scope": {
                    "description": "The Meta PAGE id the key was seen on. REQUIRED for meta_psid and ig_id — those ids are only unique within one page, so without it nothing can be matched. Leave it out for every other kind.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 256
                  },
                  "section": {
                    "description": "Which part to read. summary (the default) is the record plus the newest few history rows and notes; timeline is the recent history only; notes is their notes only. Ask for timeline or notes when the summary says more exists.",
                    "type": "string",
                    "enum": [
                      "summary",
                      "timeline",
                      "notes"
                    ]
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "found": {
                          "type": "boolean"
                        },
                        "section": {
                          "type": "string",
                          "enum": [
                            "summary",
                            "timeline",
                            "notes"
                          ]
                        },
                        "reason": {
                          "type": "string"
                        },
                        "contact_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "display_name": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "stage": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "origin": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "first_seen_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "last_seen_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "reach": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "kind": {
                                "type": "string"
                              },
                              "label": {
                                "type": "string"
                              },
                              "verified": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "kind",
                              "label",
                              "verified"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "reach_summary": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "tags": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "consent": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string"
                            },
                            "tone": {
                              "type": "string",
                              "enum": [
                                "ok",
                                "blocked",
                                "unknown"
                              ]
                            }
                          },
                          "required": [
                            "label",
                            "tone"
                          ],
                          "additionalProperties": false
                        },
                        "crm": {
                          "type": "object",
                          "properties": {
                            "section": {
                              "type": "string",
                              "enum": [
                                "on",
                                "off"
                              ]
                            },
                            "connected": {
                              "type": "boolean"
                            },
                            "last_synced_at": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": [
                            "section",
                            "connected",
                            "last_synced_at"
                          ],
                          "additionalProperties": false
                        },
                        "timeline": {
                          "maxItems": 20,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "lead": {
                                "type": "string"
                              },
                              "detail": {
                                "type": "string",
                                "maxLength": 400
                              },
                              "stamp": {
                                "type": "string"
                              },
                              "by": {
                                "type": "string"
                              },
                              "occurred_at": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "id",
                              "lead",
                              "detail",
                              "stamp",
                              "by",
                              "occurred_at"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "timeline_truncated": {
                          "type": "boolean"
                        },
                        "notes": {
                          "maxItems": 5,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "body": {
                                "type": "string",
                                "maxLength": 400
                              },
                              "source": {
                                "type": "string"
                              },
                              "created_at": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "id",
                              "body",
                              "source",
                              "created_at"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "notes_truncated": {
                          "type": "boolean"
                        },
                        "degraded": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "consent",
                        "contact_id",
                        "crm",
                        "degraded",
                        "display_name",
                        "first_seen_at",
                        "found",
                        "last_seen_at",
                        "notes",
                        "notes_truncated",
                        "origin",
                        "reach",
                        "reach_summary",
                        "reason",
                        "section",
                        "stage",
                        "tags",
                        "timeline",
                        "timeline_truncated",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/contact.note": {
      "post": {
        "operationId": "call_contact_note",
        "summary": "Call contact.note",
        "description": "Write something down on a customer's record — 'note that they asked about pricing', 'add a note to their file', 'remember they're on holiday until June'.  Write a note on a customer's record. It lands on our history first and is then mirrored to the connected CRM — if the mirror does not go, the note is still saved, and the result says which happened. Not for tagging them — that is `contact.tag`.\n\nEvery 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.",
        "tags": [
          "contact"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "contact_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The customer to write the note on."
                  },
                  "body": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 4000,
                    "description": "What to record about them, in full sentences (up to 4000 characters). It goes on their permanent history and is mirrored to the connected CRM, so write what a colleague would need, not a reminder to yourself."
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "body",
                  "contact_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "contact_id": {
                          "type": "string"
                        },
                        "local_row_id": {
                          "type": "string"
                        },
                        "crm": {
                          "type": "object",
                          "properties": {
                            "synced": {
                              "type": "boolean"
                            },
                            "reason": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "detail": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "synced",
                            "reason",
                            "detail"
                          ],
                          "additionalProperties": false
                        },
                        "replayed": {
                          "type": "boolean",
                          "description": "True when this is the first result of an earlier call with the same idempotency_key, returned without writing anything again."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "contact_id",
                        "crm",
                        "local_row_id",
                        "replayed",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/contact.tag": {
      "post": {
        "operationId": "call_contact_tag",
        "summary": "Call contact.tag",
        "description": "Put a tag on a customer or take one off — 'tag them as a hot lead', 'mark this one as a customer', 'take the VIP tag off them'.  Put ONE tag on a customer or take ONE off. Taking a tag off changes their record in the operator's real CRM, so say which tag you are removing before you do it. Both facts stay on their history — nothing is erased. Not for a free-text note on the record — that is `contact.note`. 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.\n\nEvery 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.",
        "tags": [
          "contact"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "contact_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The customer to tag."
                  },
                  "tag": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128,
                    "description": "The single tag to apply or take off."
                  },
                  "applied": {
                    "type": "boolean",
                    "description": "TRUE to put the tag on, FALSE to take it off. Taking one off changes the customer's record in the operator's real CRM, so say which one you are removing before you do it."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "contact_id",
                  "tag",
                  "applied"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "contact_id": {
                          "type": "string"
                        },
                        "local_row_id": {
                          "type": "string"
                        },
                        "crm": {
                          "type": "object",
                          "properties": {
                            "synced": {
                              "type": "boolean"
                            },
                            "reason": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "detail": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "synced",
                            "reason",
                            "detail"
                          ],
                          "additionalProperties": false
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/contact.link": {
      "post": {
        "operationId": "call_contact_link",
        "summary": "Call contact.link",
        "description": "Attach an email, phone number or handle you hold to the right customer — 'that's the same person as this lead', 'add this email to their record', 'this number belongs to them'.  Attach a key you hold from a conversation — an email, a phone number, a Messenger id — to a customer, or take one off again. Calling it shows the operator an approve card naming the change first, and nothing is written unless they approve it themselves. You cannot approve it for them, and never pass confirm_token. Keys are matched exactly, never on a likeness, and one that already belongs to somebody else is refused rather than moved. Not for looking a customer up — that is `contact.get`. 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.\n\nEvery 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.",
        "tags": [
          "contact"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "contact_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The customer this key belongs to. Read them with contact.get first — never a guess at who a key belongs to."
                  },
                  "identity_kind": {
                    "type": "string",
                    "enum": [
                      "email",
                      "phone",
                      "meta_psid",
                      "ig_id",
                      "ghl_contact_id",
                      "gbp_reviewer"
                    ],
                    "description": "Which kind of key this is: an email address, a phone number, a Messenger id (meta_psid), an Instagram id (ig_id), a CRM record id (ghl_contact_id), or a Google reviewer id."
                  },
                  "identity_value": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 512,
                    "description": "The key exactly as you observed it. It is normalised before it is looked up, so capitals in an address are fine — but a phone number without its country code cannot be matched and will be refused rather than guessed at."
                  },
                  "identity_scope": {
                    "description": "The Meta PAGE id the key was seen on. REQUIRED for meta_psid and ig_id — those ids are only unique within one page, so without it nothing can be matched. Leave it out for every other kind.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 256
                  },
                  "action": {
                    "type": "string",
                    "enum": [
                      "link",
                      "unlink"
                    ],
                    "description": "`link` attaches the key to that customer; `unlink` takes it off again. Both are recorded on their history."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "contact_id",
                  "identity_kind",
                  "identity_value",
                  "action"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "outcome": {
                          "type": "string",
                          "enum": [
                            "proposed",
                            "linked",
                            "unlinked"
                          ]
                        },
                        "contact_id": {
                          "type": "string"
                        },
                        "display_name": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "identity_kind": {
                          "type": "string",
                          "enum": [
                            "email",
                            "phone",
                            "meta_psid",
                            "ig_id",
                            "ghl_contact_id",
                            "gbp_reviewer"
                          ]
                        },
                        "identity_masked": {
                          "type": "string"
                        },
                        "evidence": {
                          "type": "string"
                        },
                        "waiting_on": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "local_row_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.ad_account_status": {
      "post": {
        "operationId": "call_connections_ad_account_status",
        "summary": "Call connections.ad_account_status",
        "description": "Check where a brand's guided ad-account setup stands — 'where are we with connecting our ad account', 'what's the status of our facebook ads setup'. Read where this brand's guided ad-account setup stands for one platform, and which step is next. Call this before answering anything about ad-account access or advertising setup — never guess the state. Read `grant_state` carefully: `awaiting_platform_access` means WE are waiting on the platform to approve our access, so the customer has nothing to do and nothing is wrong with their account; `active` is the only state that means we can manage their campaigns. Not for whether the advertising authorization is signed — that is `connections.agency_authorization_status`.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "platform": {
                    "type": "string",
                    "enum": [
                      "meta",
                      "google",
                      "tiktok",
                      "linkedin"
                    ],
                    "description": "Which advertising platform's ad account to set up on that platform's own account — the customer owns the account and grants us access to it. The allowed values are the enum's; do not offer a platform outside it."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "platform"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "platform": {
                          "type": "string",
                          "enum": [
                            "meta",
                            "google",
                            "tiktok",
                            "linkedin"
                          ]
                        },
                        "grant_state": {
                          "type": "string",
                          "enum": [
                            "not_started",
                            "awaiting_customer_creation",
                            "awaiting_authorization",
                            "awaiting_platform_access",
                            "request_issued",
                            "awaiting_customer_accept",
                            "active",
                            "revoked",
                            "failed"
                          ]
                        },
                        "status_sentence": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "external_account_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "next_step_key": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "next_step_title": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "steps": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "step_key": {
                                "type": "string"
                              },
                              "title": {
                                "type": "string"
                              },
                              "state": {
                                "type": "string",
                                "enum": [
                                  "pending",
                                  "done",
                                  "skipped"
                                ]
                              }
                            },
                            "required": [
                              "step_key",
                              "title",
                              "state"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "external_account_id",
                        "grant_state",
                        "next_step_key",
                        "next_step_title",
                        "platform",
                        "status_sentence",
                        "steps",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.agency_authorization_status": {
      "post": {
        "operationId": "call_connections_agency_authorization_status",
        "summary": "Call connections.agency_authorization_status",
        "description": "Check whether this account has signed the advertising authorization — 'have we signed the ad authorization', 'why can't we set up ad accounts'. Read whether this account has signed the advertising authorization — the written go-ahead we need before asking any advertising platform for access to their ad account. Call this whenever ad-account setup will not proceed, or when asked what we are authorized to do with their advertising. YOU CANNOT SIGN IT: signing is a person reading the document and typing their name on the Connections surface, and there is no tool for it — say what is missing and point them there. Not for the ad-account setup steps themselves — that is `connections.ad_account_status`.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "signed",
                            "not_signed",
                            "update_needs_signing",
                            "not_available_yet"
                          ]
                        },
                        "status_sentence": {
                          "type": "string"
                        },
                        "signed_version": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "signed_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "current_version": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "current_version",
                        "signed_at",
                        "signed_version",
                        "status",
                        "status_sentence",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.business_profile_status": {
      "post": {
        "operationId": "call_connections_business_profile_status",
        "summary": "Call connections.business_profile_status",
        "description": "Check whether Google Business Profile is connected and can actually post right now — 'can we post to our Google Business Profile', 'why won't a local post go out'. Report whether this workspace's Google Business Profile is connected AND whether a local post can actually go out right now. Read this BEFORE offering to publish: a Business Profile can be perfectly connected while the Business Profile API still allows zero requests, because Google has not yet approved our platform's API access application — a wait on us, not on the operator. Never tell the operator to reconnect when that is the reason. Not for publishing the local post — that is `connections.publish_local_post`.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "connected": {
                          "type": "boolean",
                          "description": "Has this workspace granted Goosy access to its Google Business Profile? Connecting is the operator's click on the Business Profile card in Connections."
                        },
                        "connected_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "api_access_approved": {
                          "type": "boolean",
                          "description": "Has GOOGLE approved our platform-wide Business Profile API access application? This is OURS, not this workspace's — no amount of reconnecting changes it, and while it is false the API allows zero requests per minute."
                        },
                        "queries_per_minute": {
                          "type": "number",
                          "description": "The request budget the Business Profile API currently allows us. Literally 0 before the access application is approved, 300 after."
                        },
                        "can_publish": {
                          "type": "boolean",
                          "description": "True only when the workspace is connected, the access application is approved, and the execution switch is on. When false, `why_not` is the sentence to give the operator — do not paraphrase it into something more hopeful, and never offer to publish."
                        },
                        "why_not": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "api_access_approved",
                        "can_publish",
                        "connected",
                        "connected_at",
                        "queries_per_minute",
                        "why_not",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.complete_ad_account_step": {
      "post": {
        "operationId": "call_connections_complete_ad_account_step",
        "summary": "Call connections.complete_ad_account_step",
        "description": "Mark one guided setup step as done — because the OPERATOR SAID THEY DID IT, as in 'I've done that step' or 'I added you as a partner' — and advance to the next. Only call this when they have told you they finished that step; it records their word, and we have no way to check it for them. Nothing is sent to the platform. One step per platform also asks for the operator's own ad account id — pass `external_account_id` there, and ask them for it if you do not have it. Call connections.ad_account_status first to see what is outstanding. There is NO tool that un-marks a step: if they need to redo one, tell them to open Connections and use “Start the steps again”, which re-opens the setup without losing the steps they already finished. Not for checking whether the access actually came through — that is `connections.check_ad_account_access`.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "platform": {
                    "type": "string",
                    "enum": [
                      "meta",
                      "google",
                      "tiktok",
                      "linkedin"
                    ],
                    "description": "Which advertising platform's ad account to set up on that platform's own account — the customer owns the account and grants us access to it. The allowed values are the enum's; do not offer a platform outside it."
                  },
                  "step_key": {
                    "type": "string",
                    "description": "The step to mark, taken VERBATIM from connections.ad_account_status' `steps` list. It is verified against the platform's own step catalog before anything is stored, so an invented or stale key refuses rather than being recorded."
                  },
                  "external_account_id": {
                    "description": "The operator's OWN ad account id, on the ONE step that asks for it (on TikTok, 'Come back and confirm' asks for the advertiser ID). Pass it only when they have told you the id; any other step refuses it rather than silently dropping it. NEVER pass a password, token or API key here; this field is an account identifier only.",
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "platform",
                  "step_key"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "platform": {
                          "type": "string",
                          "enum": [
                            "meta",
                            "google",
                            "tiktok",
                            "linkedin"
                          ]
                        },
                        "grant_state": {
                          "type": "string",
                          "enum": [
                            "not_started",
                            "awaiting_customer_creation",
                            "awaiting_authorization",
                            "awaiting_platform_access",
                            "request_issued",
                            "awaiting_customer_accept",
                            "active",
                            "revoked",
                            "failed"
                          ]
                        },
                        "status_sentence": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "external_account_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "next_step_key": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "next_step_title": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "steps": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "step_key": {
                                "type": "string"
                              },
                              "title": {
                                "type": "string"
                              },
                              "state": {
                                "type": "string",
                                "enum": [
                                  "pending",
                                  "done",
                                  "skipped"
                                ]
                              }
                            },
                            "required": [
                              "step_key",
                              "title",
                              "state"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "external_account_id",
                        "grant_state",
                        "next_step_key",
                        "next_step_title",
                        "platform",
                        "status_sentence",
                        "steps",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.conversion_events": {
      "post": {
        "operationId": "call_connections_conversion_events",
        "summary": "Call connections.conversion_events",
        "description": "See which conversions Google Analytics tracks for this brand — 'what conversions can we report on', 'which conversions are we showing now'. Read the conversions the connected Google Analytics property tracks and which of them this brand currently reports. Call this before answering anything about conversion reporting, and before changing the reported set — never guess the available list. Read `availability` first: it distinguishes a brand with no Google Analytics connection from conversion reporting being temporarily unreadable, and those are different things to tell the operator. Not for changing the reported set — that is `connections.set_conversion_events`.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "availability": {
                          "type": "string",
                          "enum": [
                            "connected",
                            "not_connected",
                            "unavailable"
                          ],
                          "description": "`connected` — the property was read and `available` lists its conversions. `not_connected` — this brand genuinely has no connected Google Analytics property; say so and offer to connect it. `unavailable` — conversion reporting is switched off or could not be read, so the connection state is UNKNOWN: say it is temporarily unavailable and NEVER say Google Analytics is not connected. On anything but `connected`, `available` is empty because nothing was read — never report it as 'no conversions are tracked'."
                        },
                        "property_name": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "available": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "event_name": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "event_name"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "reported": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "event_name": {
                                "type": "string"
                              },
                              "label": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "event_name",
                              "label"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "min_reportable": {
                          "type": "integer"
                        },
                        "max_reportable": {
                          "type": "integer"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "availability",
                        "available",
                        "max_reportable",
                        "min_reportable",
                        "property_name",
                        "reported",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.messaging_registration_status": {
      "post": {
        "operationId": "call_connections_messaging_registration_status",
        "summary": "Call connections.messaging_registration_status",
        "description": "Check whether this workspace can send texts and what's standing in the way — 'why can't we send texts', 'what's blocking our SMS'. Read whether this workspace can send texts and what is standing in the way. Call it before answering ANY question about texting, SMS, or a phone number — a workspace can own a number and still be unable to send, because the phone companies register senders separately, and that is the single most common surprise here. Read `can_send_texts` first and `why_not` second. Not for buying a texting number — that is `connections.request_number_purchase`.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "none",
                            "number_pending",
                            "compliance_pending",
                            "submitted",
                            "approved",
                            "rejected"
                          ],
                          "description": "`none` — this workspace has never started; there is no number. `number_pending` — started, no number yet. `compliance_pending` — the number IS bought and real, but the phone companies have not approved it, so texts do NOT go out. `submitted` — filed and under review. `approved` — texting is live. `rejected` — turned down, and `rejection_reason` says why. NEVER report `compliance_pending` as connected or working."
                        },
                        "can_send_texts": {
                          "type": "boolean",
                          "description": "True for `approved` only. When false, `why_not` is the sentence to give the operator — do not paraphrase it into something more hopeful."
                        },
                        "why_not": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "headline": {
                          "type": "string"
                        },
                        "next_action": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "What has to happen next, in the operator's words. Null means nobody's move — a wait on the phone companies. Never invent one."
                        },
                        "has_number": {
                          "type": "boolean"
                        },
                        "number_purchased_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "rejection_reason": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "The phone companies' own words, on `rejected` only. Quote it — it is what tells the operator what to fix."
                        },
                        "registration_steps": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "position": {
                                "type": "integer"
                              },
                              "title": {
                                "type": "string"
                              },
                              "why": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "position",
                              "title",
                              "why"
                            ],
                            "additionalProperties": false
                          },
                          "description": "The five steps the operator performs themselves in their Grow account. We cannot file the registration for them — there is no API for it — so never offer to."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "can_send_texts",
                        "has_number",
                        "headline",
                        "next_action",
                        "number_purchased_at",
                        "registration_steps",
                        "rejection_reason",
                        "state",
                        "why_not",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.probe_connector_address": {
      "post": {
        "operationId": "call_connections_probe_connector_address",
        "summary": "Call connections.probe_connector_address",
        "description": "Check how a member's own MCP server or API address wants to sign in, before they set it up — 'check this API address before I add it', 'does this connector need a token'. Ask a member's own MCP server or API address how it signs in, BEFORE they set it up. Use it when the operator says they want to bring their own connector and gives you an address: it dials the address once, reads nothing but the way it refuses, and reports whether it wants a token, a sign-in with the provider, or nothing at all. It writes no row, stores no credential and registers nothing — finishing the setup is the operator's own act in Connections → Add custom connector, because the token they may need to paste is a value no tool may ever carry. Not for refreshing a connector already set up — that is `connections.resync_custom_connector`.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "kind": {
                    "type": "string",
                    "enum": [
                      "mcp",
                      "openapi"
                    ],
                    "description": "`mcp` for a remote MCP server, `openapi` for a REST API described by an OpenAPI document. Ask the operator which they have rather than guessing from the address."
                  },
                  "address": {
                    "type": "string",
                    "description": "The address to ask, exactly as the operator gave it: the MCP server's own https URL for `mcp`, or the https URL of the OpenAPI document for `openapi`. It is judged by the same SSRF floor the real dial takes, so a private or non-https address refuses here rather than being probed."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "kind",
                  "address"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "auth_mode": {
                          "type": "string",
                          "enum": [
                            "oauth",
                            "bearer",
                            "none"
                          ],
                          "description": "`oauth` — the address wants the operator to sign in with the provider; there is nothing to paste. `bearer` — it wants a token the operator holds. `none` — it answered without asking for anything. It is a DEFAULT for the Add custom connector sheet, never a boundary: the operator can override it under Advanced, and the registration re-validates whatever it is actually given."
                        },
                        "evidence": {
                          "type": "string",
                          "description": "How the answer was reached, in the rail's own vocabulary (for example `oauth_challenge`, `credential_challenge`, `document_key_scheme`, `reachable`). Never an address and never a credential. Quote it only if the operator asks why."
                        },
                        "oauth_endpoints_known": {
                          "anyOf": [
                            {
                              "type": "boolean"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "For an API only: whether the rail already knows where the provider's sign-in lives. `false` means the operator will be asked for the authorize and token URLs during setup — say so before they start. `null` for an MCP server, whose endpoints come from its own discovery."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "auth_mode",
                        "evidence",
                        "oauth_endpoints_known",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.read_history": {
      "post": {
        "operationId": "call_connections_read_history",
        "summary": "Call connections.read_history",
        "description": "Read a connected account's last 90 days so Goosy learns how this brand writes there — 'learn how we write on LinkedIn', 'read our last posts so you get our voice'. It starts a background read and returns immediately — report the status EXACTLY as returned and never claim the profile is ready. It learns MESSAGING only, never the look, and it publishes nothing. Not for re-checking which accounts a connection can post to — that is `connections.recheck_accounts`.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "platform": {
                    "type": "string",
                    "minLength": 1,
                    "description": "Which connected account to read — instagram, facebook or linkedin. Never a platform the brand has not connected."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "platform"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "reading",
                            "already_reading",
                            "not_readable"
                          ]
                        },
                        "platform": {
                          "type": "string"
                        },
                        "line": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "line",
                        "platform",
                        "status",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.request_number_purchase": {
      "post": {
        "operationId": "call_connections_request_number_purchase",
        "summary": "Call connections.request_number_purchase",
        "description": "Get this workspace its own texting number — 'buy us a texting number', 'get a phone number for SMS'. Buy a texting number for this workspace. It SPENDS MONEY — a number carries a recurring monthly charge — so calling it raises the approval card naming the number and its monthly charge, which is the operator's confirmation, and it buys only on their approve. Pass the exact number the operator chose. Buying a number does NOT make texting work: the number lands in `compliance_pending` and the operator still has to register it with the phone companies, which is a step only they can do. Say that when you offer it. Not for why texts cannot go out — that is `connections.messaging_registration_status`. 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.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone_number": {
                    "type": "string",
                    "description": "The number to buy, in full international format. It must be one the operator has chosen from the available list — never one you composed, and never a number the operator merely mentioned in passing."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "phone_number"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "compliance_pending"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "phone_number": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.set_conversion_events": {
      "post": {
        "operationId": "call_connections_set_conversion_events",
        "summary": "Call connections.set_conversion_events",
        "description": "Choose which conversions this brand reports on its performance cards — 'show these conversions on our dashboard', 'change which conversions we report'. Set which conversions this brand reports on its performance cards. Pass the COMPLETE set in report order — it replaces the current selection rather than adding to it — with 3 to 5 entries taken verbatim from connections.conversion_events. Nothing is published and no connection is changed; this only picks which numbers are shown. Not for seeing which conversions are available — that is `connections.conversion_events`.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "events": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "event_name": {
                          "type": "string",
                          "description": "A GA4 event name taken VERBATIM from connections.conversion_events' `available` list. It is verified against the connected property's own events before anything is stored, so an invented or stale name refuses rather than being reported."
                        },
                        "label": {
                          "description": "Optional friendlier label; omit to show the event name.",
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "event_name"
                      ],
                      "additionalProperties": false
                    },
                    "description": "The complete reported set, in report order. This REPLACES the current selection — it is not additive — so include every conversion that should stay. 3 to 5 entries."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "events"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "reported": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "event_name": {
                                "type": "string"
                              },
                              "label": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "event_name",
                              "label"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "reported",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.start_ad_account_setup": {
      "post": {
        "operationId": "call_connections_start_ad_account_setup",
        "summary": "Call connections.start_ad_account_setup",
        "description": "Begin or resume the guided setup for connecting a brand's own ad account — 'help me connect our ad account', 'walk me through ad account setup'. Begin or resume the guided setup that gets us access to this brand's own ad account on one platform, and return the next step. Safe to call when setup is already under way — it RESUMES and never resets progress. Nothing is sent to the platform and nothing is spent; this only opens the guided steps the operator then performs in the platform's own tools. Not for marking one step done — that is `connections.complete_ad_account_step`.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "platform": {
                    "type": "string",
                    "enum": [
                      "meta",
                      "google",
                      "tiktok",
                      "linkedin"
                    ],
                    "description": "Which advertising platform's ad account to set up on that platform's own account — the customer owns the account and grants us access to it. The allowed values are the enum's; do not offer a platform outside it."
                  },
                  "external_account_id": {
                    "description": "The operator's OWN ad account id, if they already have an account and have told you the id (a Meta act id, a Google 10-digit customer id, a TikTok advertiser id). Omit it when they are making a new account — that is the normal case and the walkthrough collects it later. NEVER pass a password, token or API key here; this field is an account identifier only.",
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "platform"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "platform": {
                          "type": "string",
                          "enum": [
                            "meta",
                            "google",
                            "tiktok",
                            "linkedin"
                          ]
                        },
                        "grant_state": {
                          "type": "string",
                          "enum": [
                            "not_started",
                            "awaiting_customer_creation",
                            "awaiting_authorization",
                            "awaiting_platform_access",
                            "request_issued",
                            "awaiting_customer_accept",
                            "active",
                            "revoked",
                            "failed"
                          ]
                        },
                        "status_sentence": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "external_account_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "next_step_key": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "next_step_title": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "steps": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "step_key": {
                                "type": "string"
                              },
                              "title": {
                                "type": "string"
                              },
                              "state": {
                                "type": "string",
                                "enum": [
                                  "pending",
                                  "done",
                                  "skipped"
                                ]
                              }
                            },
                            "required": [
                              "step_key",
                              "title",
                              "state"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "external_account_id",
                        "grant_state",
                        "next_step_key",
                        "next_step_title",
                        "platform",
                        "status_sentence",
                        "steps",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/links.shorten": {
      "post": {
        "operationId": "call_links_shorten",
        "summary": "Call links.shorten",
        "description": "Get a tracked short link, with its UTMs, for a web address going out in a post, email, ad or text — 'shorten this link for the post', 'give me a trackable link for this email'. A short version of an address is this link, never a summary of the page. Returns the short link to use in the copy, and the UTMs it carries: source, medium and campaign are made from what it goes out on and the address unless the member names their own utm_source, utm_medium or campaign, which it takes. Calling it twice for the same piece on the same platform returns the SAME link rather than making a second one, so it is safe to re-run. The link goes out on whichever name this brand's links carry; use links.domain_set to change that. Not for how many clicks a link had — that is `links.report`.\n\nEvery 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.",
        "tags": [
          "links"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "target_url": {
                    "type": "string",
                    "description": "The secure (https) web address people should land on. Always a page this brand owns."
                  },
                  "source_kind": {
                    "type": "string",
                    "enum": [
                      "post_version",
                      "email",
                      "ad",
                      "sms",
                      "link_page",
                      "manual"
                    ],
                    "description": "What the link is going out ON. Use `manual` only when it belongs to nothing in the system."
                  },
                  "source_id": {
                    "description": "The id of the post, email, ad or page it belongs to. Required for every kind except `manual` — it is what makes re-running this safe.",
                    "type": "string"
                  },
                  "platform": {
                    "description": "Where it is going out: instagram, facebook, linkedin, email, sms… Defaults to `manual`.",
                    "type": "string"
                  },
                  "campaign": {
                    "description": "The campaign this belongs to; it is also the link's utm_campaign. Leave it out to take the one made from the address.",
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "utm_source": {
                    "description": "Only when the member names a different utm_source. Leave it out to take the one made from the platform.",
                    "type": "string"
                  },
                  "utm_medium": {
                    "description": "Only when the member names a different utm_medium. Leave it out to take the one made from what the link goes out on.",
                    "type": "string"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "target_url",
                  "source_kind"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "short_url": {
                          "type": "string"
                        },
                        "goes_out_on": {
                          "type": "string"
                        },
                        "points_at": {
                          "type": "string"
                        },
                        "utm": {
                          "type": "object",
                          "propertyNames": {
                            "type": "string"
                          },
                          "additionalProperties": {
                            "type": "string"
                          }
                        },
                        "already_existed": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "already_existed",
                        "goes_out_on",
                        "points_at",
                        "short_url",
                        "utm",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/links.report": {
      "post": {
        "operationId": "call_links_report",
        "summary": "Call links.report",
        "description": "Check how many clicks this brand's tracked links have had — 'how many clicks did this link get', 'how did this campaign's links perform'. Read how many clicks this brand's tracked links have had — for one piece, one campaign, this week, or the whole brand. Returns a sentence you can say as-is plus the rows behind it, and `goes_out_on` / `domain_is_ours`, which tell you whether this brand's links are riding the platform's name or the brand's own. Call this before answering any question about clicks; never guess a number. Not for making a new tracked link — that is `links.shorten`.\n\nEvery 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.",
        "tags": [
          "links"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "scope": {
                    "type": "string",
                    "enum": [
                      "piece",
                      "campaign",
                      "week",
                      "brand"
                    ],
                    "description": "What the numbers are about: one `piece`, one `campaign`, this `week`, or the whole `brand`."
                  },
                  "id": {
                    "description": "The piece's id for `piece`, or the campaign's name for `campaign`. Leave it out for `week` and `brand`.",
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "scope"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "answer": {
                          "type": "string"
                        },
                        "total_clicks": {
                          "type": "number"
                        },
                        "link_count": {
                          "type": "number"
                        },
                        "goes_out_on": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "domain_is_ours": {
                          "anyOf": [
                            {
                              "type": "boolean"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "links": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "short_url": {
                                "type": "string"
                              },
                              "title": {
                                "type": "string"
                              },
                              "platform": {
                                "type": "string"
                              },
                              "clicks": {
                                "type": "number"
                              }
                            },
                            "required": [
                              "short_url",
                              "title",
                              "platform",
                              "clicks"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer",
                        "domain_is_ours",
                        "goes_out_on",
                        "link_count",
                        "links",
                        "total_clicks",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/links.domain_set": {
      "post": {
        "operationId": "call_links_domain_set",
        "summary": "Call links.domain_set",
        "description": "Move this brand's tracked links onto a domain the customer owns — 'use our own domain for tracked links', 'check if our link domain is set up yet'. Put this brand's tracked links on a domain the customer owns — for the whole account or for one brand — and check on one that is still being set up. Pass the ROOT domain they own (northwindcoffee.com); the links. prefix is added for them. If we hold the domain we add the record ourselves and it is live in about a minute; otherwise the answer carries the one record they add wherever their domain lives, and `action: \"check\"` with the returned id looks for it. Links already out there keep working either way. Not for connecting a domain to a site — that is `domain.connect`.\n\nEvery 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.",
        "tags": [
          "links"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "action": {
                    "type": "string",
                    "enum": [
                      "set",
                      "check"
                    ],
                    "description": "`set` puts the links on a domain they own; `check` looks again for a record they were asked to add."
                  },
                  "root_domain": {
                    "description": "The domain they own, e.g. northwindcoffee.com. Required for `set`. Do not add a prefix — that is added for them.",
                    "type": "string"
                  },
                  "level": {
                    "description": "`workspace` (the default) sets it for THIS brand; `tenant` sets it for the whole account, covering every brand that has none of its own.",
                    "type": "string",
                    "enum": [
                      "tenant",
                      "workspace"
                    ]
                  },
                  "link_domain_id": {
                    "description": "Required for `check` — the id the `set` call returned.",
                    "type": "string"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "action"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "link_domain_id": {
                          "type": "string"
                        },
                        "hostname": {
                          "type": "string"
                        },
                        "state": {
                          "type": "string"
                        },
                        "live": {
                          "type": "boolean"
                        },
                        "we_set_the_record": {
                          "type": "boolean"
                        },
                        "record": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "type": {
                                  "type": "string"
                                },
                                "name": {
                                  "type": "string"
                                },
                                "points_to": {
                                  "type": "string"
                                }
                              },
                              "required": [
                                "type",
                                "name",
                                "points_to"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "hostname",
                        "link_domain_id",
                        "live",
                        "record",
                        "state",
                        "we_set_the_record",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ghl.apply_tag": {
      "post": {
        "operationId": "call_ghl_apply_tag",
        "summary": "Call ghl.apply_tag",
        "description": "Add ONE tag to a contact in this workspace's connected CRM — 'tag this contact as a hot lead', 'add the VIP tag to them'. It ADDS only — every other tag on the contact is left exactly as it was, and there is no bulk or replace form. The tag must already exist in this connection's tag registry; an unknown tag is refused and raised as an alignment warning rather than silently creating one. Not for taking a tag off — that is `ghl.remove_tag`.\n\nEvery 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.",
        "tags": [
          "ghl"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "contactId": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "The CRM contact id to tag. Required — this never guesses."
                  },
                  "tag": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "The ONE tag name to add or remove. Exactly one; there is no bulk form."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "contactId",
                  "tag"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean"
                        },
                        "implementation": {
                          "type": "string"
                        },
                        "externalId": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "refusalCode": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "refusalMessage": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "externalId",
                        "implementation",
                        "refusalCode",
                        "refusalMessage",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ghl.remove_tag": {
      "post": {
        "operationId": "call_ghl_remove_tag",
        "summary": "Call ghl.remove_tag",
        "description": "Remove ONE tag from a contact in this workspace's connected CRM — 'take the VIP tag off them', 'remove the cold-lead tag'. It removes only the named tag and leaves every other tag untouched. The tag must already exist in this connection's tag registry. Not for adding a tag — that is `ghl.apply_tag`. 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.\n\nEvery 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.",
        "tags": [
          "ghl"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "contactId": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "The CRM contact id to tag. Required — this never guesses."
                  },
                  "tag": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "The ONE tag name to add or remove. Exactly one; there is no bulk form."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "contactId",
                  "tag"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean"
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "implementation": {
                          "type": "string"
                        },
                        "externalId": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "refusalCode": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "refusalMessage": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ghl.send_email": {
      "post": {
        "operationId": "call_ghl_send_email",
        "summary": "Call ghl.send_email",
        "description": "Send ONE email to a contact through this workspace's connected CRM, using the CRM's own sending domain — 'email this contact about the offer', 'send them a follow-up email'. It puts a message in a real person's inbox and cannot be recalled, so it PREPARES the send and stops: the operator is shown the subject, the body and who it is going to on a card, and only their approve sends it. Not for this week's marketing campaign email — that is `email_campaign.draft`. 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.\n\nEvery 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.",
        "tags": [
          "ghl"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "contactId": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "The CRM contact id to email."
                  },
                  "subject": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 500,
                    "description": "The subject line."
                  },
                  "html": {
                    "description": "HTML body. At least one of `html` or `text` is required — a send with neither is refused.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200000
                  },
                  "text": {
                    "description": "Plain-text body. At least one of `html` or `text` is required — a send with neither is refused.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200000
                  },
                  "fromAddress": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 320,
                    "description": "A VERIFIED sending address on the connected sub-account. Required: there is no default sender to fall back to, and an unverified address is refused by the provider."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "contactId",
                  "subject",
                  "fromAddress"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean"
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "implementation": {
                          "type": "string"
                        },
                        "externalId": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "refusalCode": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "refusalMessage": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/splash_pad.start": {
      "post": {
        "operationId": "call_splash_pad_start",
        "summary": "Call splash_pad.start",
        "description": "Open the member's Splash Pad, the landing project where anything they start without picking a project goes — 'where do I just think out loud?', 'open my scratch space', 'where did my new document end up?'. It answers the workspace's one Splash Pad by name and id, untouched: it never creates a project or a board, and nothing is published or spent. Not for renaming it — that is `board.rename`.\n\nEvery 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.",
        "tags": [
          "splash_pad"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "created": {
                          "type": "boolean"
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "board_id",
                        "created",
                        "name",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/splash_pad.write_article": {
      "post": {
        "operationId": "call_splash_pad_write_article",
        "summary": "Call splash_pad.write_article",
        "description": "Draft an article for the member — 'write me a blog post about this', 'draft an article on that topic', 'put together a write-up for the website'. You write the words: pass the headline they asked for and the body as markdown. It saves the draft as a document in the project they are working in (the one they name with board_id, else the one this conversation is about, else their Splash Pad) and hands back a link to the article's workflow, where THEY mark it final, make it a piece and publish it — this tool does none of those and never publishes anything. Not for putting a finished article on a site's blog — that is `page.write_article`.\n\nEvery 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.",
        "tags": [
          "splash_pad"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "The headline, as the operator would write it. REQUIRED — nothing is derived from the body, because an article published without a real title reads as “(no title)” to readers."
                  },
                  "body_markdown": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The article itself, in markdown. Headings, bold, italic, lists and links are kept; anything else arrives as its text."
                  },
                  "board_id": {
                    "description": "The project to put it in, when the operator names one: its board_id from something you were shown. Leave it out and it lands in the project they are working in, else their Splash Pad.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "title",
                  "body_markdown"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "document_id": {
                          "type": "string"
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "project_name": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "title": {
                          "type": "string"
                        },
                        "workflow_href": {
                          "type": "string"
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "board_id",
                        "document_id",
                        "project_name",
                        "title",
                        "workflow_href",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/board.write_document": {
      "post": {
        "operationId": "call_board_write_document",
        "summary": "Call board.write_document",
        "description": "'put the call script on the sales board', 'replace the Gravity call script with this version', 'update the onboarding doc' — create one document on a board of this workspace, or replace one in place. Without document_id it creates a new document on the board; with the document_id an earlier call returned it replaces that document's title and whole text and keeps its id, so publishing a new version never adds a duplicate. Pass the updated_at the last answer returned as expected_updated_at: a document a member saved since is refused and left unchanged. A replace overwrites the previous title and text, which cannot be brought back. It answers the document's id, its new updated_at and the path a member opens it at. Not for drafting an article that opens the Splash Pad's article workflow — that is `splash_pad.write_article`.\n\nEvery 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.",
        "tags": [
          "board"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The board the document is on, or goes on, as `board.tree` returned it."
                  },
                  "document_id": {
                    "description": "The document to replace, as an earlier `board.write_document` returned it. Omit to create a new document on the board.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "title": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "The document's title, replacing any title it had."
                  },
                  "body_markdown": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The whole document in markdown, replacing everything it held. Headings, bold, italic, lists and links are kept; anything else arrives as its text."
                  },
                  "expected_updated_at": {
                    "description": "With document_id only: the updated_at an earlier answer returned. A document saved since is refused and left unchanged. Omit to replace it as it reads now.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 64
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "board_id",
                  "title",
                  "body_markdown"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "document_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "board_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "title": {
                          "type": "string"
                        },
                        "updated_at": {
                          "type": "string",
                          "description": "The document's version after this write; pass it as expected_updated_at to replace it again safely."
                        },
                        "created": {
                          "type": "boolean",
                          "description": "true when this call made the document, false when it replaced one."
                        },
                        "url": {
                          "type": "string",
                          "description": "Where a member opens the document in the product, as a path: a Splash Pad document opens in its article workflow, any other on its board."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "board_id",
                        "created",
                        "document_id",
                        "title",
                        "updated_at",
                        "url",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/memory.move_chats_to_members": {
      "post": {
        "operationId": "call_memory_move_chats_to_members",
        "summary": "Call memory.move_chats_to_members",
        "description": "'move this workspace's earlier chats to their authors' — move one page of this workspace's chat conversations from the workspace's shared memory key to each conversation's author, so each member's past chats are recalled only into their own turns. Callable only with the workspace's own integration key; any other key is refused. A conversation used in the last few minutes, or waiting on a question or approval, is left for a later call; a conversation with no author stays shared; a moved conversation moves nothing again. Nothing is deleted. Call again with the next_after it returns until next_after is null.\n\nEvery 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.",
        "tags": [
          "memory"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "after": {
                    "description": "The next_after an earlier call returned, to continue with the next page. Omit to start from the first conversation.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "conversations": {
                          "type": "integer",
                          "description": "How many conversations this page read."
                        },
                        "moved": {
                          "type": "object",
                          "properties": {
                            "threads": {
                              "type": "integer"
                            },
                            "messages": {
                              "type": "integer"
                            },
                            "observations": {
                              "type": "integer"
                            },
                            "vectors": {
                              "type": "integer"
                            }
                          },
                          "required": [
                            "threads",
                            "messages",
                            "observations",
                            "vectors"
                          ],
                          "description": "The rows this page moved to their authors' keys.",
                          "additionalProperties": false
                        },
                        "skipped": {
                          "type": "object",
                          "properties": {
                            "suspended_run": {
                              "type": "integer"
                            },
                            "recent_activity": {
                              "type": "integer"
                            }
                          },
                          "required": [
                            "suspended_run",
                            "recent_activity"
                          ],
                          "description": "Conversations left for a later call: one waiting on a question or card, or one used in the last few minutes.",
                          "additionalProperties": false
                        },
                        "next_after": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Pass as after to move the next page; null when this workspace has no more conversations."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "conversations",
                        "moved",
                        "next_after",
                        "skipped",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/widget.list": {
      "post": {
        "operationId": "call_widget_list",
        "summary": "Call widget.list",
        "description": "Read the widgets on every desk and project in one call — 'what's on my desks?', 'which charts are on the Client project?', 'how many leads did we get yesterday?' — each widget, what it shows, every desk or project it is placed on and what that placement reads, the Dashboard's desks (its tabs), and the figures across the top of the Dashboard as the card shows them: yesterday's leads against their recent daily average, pieces shipped this week and pieces booked for next week. Leads are counted per day, so a question about yesterday's leads is answered from these figures. Call it first before changing, trashing, placing or binding a widget: the other verbs need its id, and the member names widgets the way they see them ('the ad-spend chart'). Narrow it to one desk by its name, or one desk or project by an id this call or the page gave you, or read the widgets in the Trash. It changes nothing. Not for making a widget — that is `widget.add`; not for the week's story — that is `briefing.read`; not for the numbers a chart shows — that is `analytics.query_metrics` with the chart's metric_keys.\n\nEvery 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.",
        "tags": [
          "widget"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "description": "Only the widgets on this project (not a desk), by its id from `board.tree`.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "in_trash": {
                    "description": "True to read the widgets in the Trash instead — the ones trashed in the last 30 days, which `item.restore` brings back.",
                    "type": "boolean"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "figures": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "leads_counted_per": {
                                  "type": "string",
                                  "const": "day"
                                },
                                "leads_day": {
                                  "type": "string"
                                },
                                "lines": {
                                  "type": "array",
                                  "items": {
                                    "type": "object",
                                    "properties": {
                                      "label": {
                                        "type": "string"
                                      },
                                      "figure": {
                                        "type": "string"
                                      },
                                      "change": {
                                        "anyOf": [
                                          {
                                            "type": "string"
                                          },
                                          {
                                            "type": "null"
                                          }
                                        ]
                                      },
                                      "detail": {
                                        "type": "string"
                                      }
                                    },
                                    "required": [
                                      "label",
                                      "figure",
                                      "change",
                                      "detail"
                                    ],
                                    "additionalProperties": false
                                  }
                                }
                              },
                              "required": [
                                "leads_counted_per",
                                "leads_day",
                                "lines"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "dashboard": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "board_id": {
                                  "type": "string"
                                },
                                "desks": {
                                  "type": "array",
                                  "items": {
                                    "type": "object",
                                    "properties": {
                                      "board_id": {
                                        "type": "string"
                                      },
                                      "name": {
                                        "type": "string"
                                      }
                                    },
                                    "required": [
                                      "board_id",
                                      "name"
                                    ],
                                    "additionalProperties": false
                                  }
                                }
                              },
                              "required": [
                                "board_id",
                                "desks"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "widgets": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "propertyNames": {
                              "type": "string"
                            },
                            "additionalProperties": {}
                          }
                        },
                        "truncated": {
                          "type": "boolean"
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "dashboard",
                        "figures",
                        "truncated",
                        "widgets",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/widget.add": {
      "post": {
        "operationId": "call_widget_add",
        "summary": "Call widget.add",
        "description": "Make a new widget on the desk or project the member is on — 'add a chart of our weekly visits', 'put a button here that refreshes the briefing', 'add a switch for the welcome automation to this desk'. A widget is a chart, a single number, a breakdown table, a monitor on one thing, a link straight back to a site, page, board or Data table, a note in their words, a button that presses one tool or starts one automation, or a switch that turns one automation on and off. It lands on the desk the call names, else the desk or project the member is on, else the Dashboard's first desk. For numbers, only call it when you know which numbers it shows and how far back it looks; if the ask is vague, ask one short question first. For one site or page use the site_* numbers with site_id (from `page.list`) or page_path. Never invent an id for a link, a button or a switch — read it from a tool that listed the thing. An expiry is a promise: pass expires_in_days when they said how long they want it. Not for a bespoke coded card — that is `desk.build_card`; not for showing an existing widget somewhere else — that is `work.shortcut`.\n\nEvery 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.",
        "tags": [
          "widget"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "description": "The desk or project it goes on, by its id (a desk's from `widget.list`, a project's from `board.tree`). Omit it for the desk or project the member is on.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "kind": {
                    "type": "string",
                    "enum": [
                      "chart",
                      "table",
                      "kpi",
                      "monitor",
                      "note",
                      "link",
                      "button",
                      "switch",
                      "briefing",
                      "needs_you",
                      "analytics"
                    ],
                    "description": "chart for a trend over time · kpi for one number · table for a breakdown · monitor to watch one thing · link for a way straight back to a site, page, board or Data table · note for anything they want written down · button to press one tool or start one automation · switch to turn one automation on and off, or flip one yes/no cell of a Data table · briefing, needs_you and analytics for the week's briefing, what is waiting on them and their analytics panel."
                  },
                  "title": {
                    "type": "string",
                    "minLength": 1,
                    "description": "What they will see on it. Plain business language, their words where you have them."
                  },
                  "metric_keys": {
                    "description": "Which numbers it shows. Required on chart, table, kpi and monitor; omitted on every other kind.",
                    "minItems": 1,
                    "maxItems": 6,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "rev_leads",
                        "rev_booked_calls",
                        "rev_calls_showed",
                        "rev_show_rate",
                        "rev_sales_won",
                        "rev_revenue_won",
                        "rev_revenue_by_source",
                        "rev_open_pipeline_value",
                        "email_sent",
                        "email_delivered",
                        "email_delivery_rate",
                        "email_opened",
                        "email_open_rate",
                        "email_clicked",
                        "email_click_rate",
                        "email_replied",
                        "email_complaint_rate",
                        "email_bounce_rate",
                        "list_size",
                        "list_new_subscribers",
                        "list_unsubscribe_rate",
                        "ads_spend",
                        "ads_impressions",
                        "ads_clicks",
                        "ads_ctr",
                        "ads_cpc",
                        "ads_cpm",
                        "ads_reach",
                        "ads_frequency",
                        "ads_conversions",
                        "ads_cost_per_lead",
                        "ads_cost_per_booked_call",
                        "ads_attributed_revenue",
                        "vid_views",
                        "vid_watch_time_minutes",
                        "vid_avg_view_duration",
                        "vid_impressions",
                        "vid_impressions_ctr",
                        "vid_subscribers_gained",
                        "vid_net_subscribers",
                        "vid_breakout_score",
                        "soc_posts_published",
                        "soc_impressions",
                        "soc_engagements",
                        "soc_engagement_rate",
                        "soc_meta_impressions",
                        "soc_meta_engagements",
                        "soc_meta_engagement_rate",
                        "soc_fb_impressions",
                        "soc_fb_engagements",
                        "soc_fb_engagement_rate",
                        "soc_ig_impressions",
                        "soc_ig_reach",
                        "soc_ig_engagements",
                        "soc_ig_engagement_rate",
                        "soc_ig_profile_visits",
                        "soc_ig_new_follows",
                        "sys_produced",
                        "hyros_attributed_revenue",
                        "hyros_attributed_leads",
                        "web_sessions",
                        "web_active_users",
                        "web_conversions",
                        "web_revenue",
                        "web_search_impressions",
                        "web_search_clicks",
                        "web_search_ctr",
                        "web_search_position",
                        "site_views",
                        "site_visitors",
                        "site_sessions",
                        "site_conversions",
                        "site_conversion_rate"
                      ]
                    }
                  },
                  "grain": {
                    "description": "How the numbers are bucketed. Use 'day' for a chart unless they asked for weeks or months.",
                    "type": "string",
                    "enum": [
                      "hour",
                      "day",
                      "week",
                      "month",
                      "quarter",
                      "year",
                      "lifetime"
                    ]
                  },
                  "window_periods": {
                    "description": "How far back it looks, counted in `grain` periods. 'the last 28 days' with grain=day is 28.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 366
                  },
                  "compare": {
                    "description": "What it compares against. 'previous_period' is the usual answer; 'none' shows a bare number.",
                    "type": "string",
                    "enum": [
                      "none",
                      "previous_period",
                      "same_period_last_year"
                    ]
                  },
                  "entity": {
                    "description": "The thing a monitor watches, e.g. {kind: 'ad_set', id: '...'}. Required for that kind.",
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "minLength": 1
                      },
                      "id": {
                        "type": "string",
                        "minLength": 1
                      }
                    },
                    "required": [
                      "kind",
                      "id"
                    ],
                    "additionalProperties": false
                  },
                  "condition": {
                    "description": "The 'tell me when' threshold. 'no_change_for' takes a number of days as its value.",
                    "type": "object",
                    "properties": {
                      "metric_key": {
                        "type": "string",
                        "enum": [
                          "rev_leads",
                          "rev_booked_calls",
                          "rev_calls_showed",
                          "rev_show_rate",
                          "rev_sales_won",
                          "rev_revenue_won",
                          "rev_revenue_by_source",
                          "rev_open_pipeline_value",
                          "email_sent",
                          "email_delivered",
                          "email_delivery_rate",
                          "email_opened",
                          "email_open_rate",
                          "email_clicked",
                          "email_click_rate",
                          "email_replied",
                          "email_complaint_rate",
                          "email_bounce_rate",
                          "list_size",
                          "list_new_subscribers",
                          "list_unsubscribe_rate",
                          "ads_spend",
                          "ads_impressions",
                          "ads_clicks",
                          "ads_ctr",
                          "ads_cpc",
                          "ads_cpm",
                          "ads_reach",
                          "ads_frequency",
                          "ads_conversions",
                          "ads_cost_per_lead",
                          "ads_cost_per_booked_call",
                          "ads_attributed_revenue",
                          "vid_views",
                          "vid_watch_time_minutes",
                          "vid_avg_view_duration",
                          "vid_impressions",
                          "vid_impressions_ctr",
                          "vid_subscribers_gained",
                          "vid_net_subscribers",
                          "vid_breakout_score",
                          "soc_posts_published",
                          "soc_impressions",
                          "soc_engagements",
                          "soc_engagement_rate",
                          "soc_meta_impressions",
                          "soc_meta_engagements",
                          "soc_meta_engagement_rate",
                          "soc_fb_impressions",
                          "soc_fb_engagements",
                          "soc_fb_engagement_rate",
                          "soc_ig_impressions",
                          "soc_ig_reach",
                          "soc_ig_engagements",
                          "soc_ig_engagement_rate",
                          "soc_ig_profile_visits",
                          "soc_ig_new_follows",
                          "sys_produced",
                          "hyros_attributed_revenue",
                          "hyros_attributed_leads",
                          "web_sessions",
                          "web_active_users",
                          "web_conversions",
                          "web_revenue",
                          "web_search_impressions",
                          "web_search_clicks",
                          "web_search_ctr",
                          "web_search_position",
                          "site_views",
                          "site_visitors",
                          "site_sessions",
                          "site_conversions",
                          "site_conversion_rate"
                        ]
                      },
                      "operator": {
                        "type": "string",
                        "enum": [
                          "above",
                          "below",
                          "no_change_for"
                        ]
                      },
                      "value": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "metric_key",
                      "operator",
                      "value"
                    ],
                    "additionalProperties": false
                  },
                  "link_target_kind": {
                    "description": "For a link: what it opens — a site, a page, a board (or project), or a Data table. Required for that kind.",
                    "type": "string",
                    "enum": [
                      "page",
                      "site",
                      "board",
                      "data_table"
                    ]
                  },
                  "link_target_id": {
                    "description": "For a link: the id of the thing it opens, read from a tool that listed it — a link to an id that does not resolve is a dead widget.",
                    "type": "string",
                    "minLength": 1
                  },
                  "note_body": {
                    "description": "For a note: what it says, in their words where you have them. Markdown renders. Required for that kind.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 8000
                  },
                  "site_id": {
                    "description": "For site_* numbers only: narrow it to one of their sites, by its id from `page.list` — never an invented id. Add page_path for one page of it.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "page_path": {
                    "description": "For site_* numbers only: narrow it to one page by its path, like /pricing — that path on every site unless site_id is also given.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 1024
                  },
                  "label": {
                    "description": "For a button or a switch: the words on it.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "press_tool": {
                    "description": "For a button that presses a tool: the tool's name, like 'briefing.regenerate'. Pressing it runs that tool behind the tool's own approval.",
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_]*(?:\\.[a-z][a-z0-9_]*)+$"
                  },
                  "press_automation_id": {
                    "description": "For a button that starts an automation: its id, read from a tool that listed it.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "switch_automation_id": {
                    "description": "For a switch that turns an automation on and off: its id, read from a tool that listed it.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "switch_data_table_id": {
                    "description": "For a switch on one yes/no cell: the Data table's id. Pass switch_row_id and switch_column with it.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "switch_row_id": {
                    "description": "For a switch on one yes/no cell: the row's id.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "switch_column": {
                    "description": "For a switch on one yes/no cell: the column's key.",
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_]{0,63}$"
                  },
                  "expires_in_days": {
                    "description": "Take it down again after this many days. 'for two weeks' is 14. Omit for a widget that stands until they remove it.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 366
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "kind",
                  "title"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "widget_id": {
                          "type": "string"
                        },
                        "board_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "replayed": {
                          "type": "boolean",
                          "description": "True when this is the first result of an earlier call with the same idempotency_key, returned without writing anything again."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "board_id",
                        "replayed",
                        "widget_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/widget.update": {
      "post": {
        "operationId": "call_widget_update",
        "summary": "Call widget.update",
        "description": "Change what a widget that already exists shows — 'make it look back 90 days', 'point the button at the weekly report automation', 'show bookings instead of visits' — the numbers it shows and how far back it looks, its 'tell me when' threshold, a note's words, where a link goes, or what a button presses or a switch turns. Only the parts you pass change. What kind of widget it is cannot change: that is a new widget. The change shows wherever the widget is placed. Not for its name — that is `item.rename`; not for what one placement reads — that is `widget.bind`; not for how long it stays up — that is `widget.set_expiry`.\n\nEvery 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.",
        "tags": [
          "widget"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "widget_id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The widget's id, from `widget.list`. Never an id you did not read."
                  },
                  "metric_keys": {
                    "description": "Which numbers it shows. Required on chart, table, kpi and monitor; omitted on every other kind.",
                    "minItems": 1,
                    "maxItems": 6,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "rev_leads",
                        "rev_booked_calls",
                        "rev_calls_showed",
                        "rev_show_rate",
                        "rev_sales_won",
                        "rev_revenue_won",
                        "rev_revenue_by_source",
                        "rev_open_pipeline_value",
                        "email_sent",
                        "email_delivered",
                        "email_delivery_rate",
                        "email_opened",
                        "email_open_rate",
                        "email_clicked",
                        "email_click_rate",
                        "email_replied",
                        "email_complaint_rate",
                        "email_bounce_rate",
                        "list_size",
                        "list_new_subscribers",
                        "list_unsubscribe_rate",
                        "ads_spend",
                        "ads_impressions",
                        "ads_clicks",
                        "ads_ctr",
                        "ads_cpc",
                        "ads_cpm",
                        "ads_reach",
                        "ads_frequency",
                        "ads_conversions",
                        "ads_cost_per_lead",
                        "ads_cost_per_booked_call",
                        "ads_attributed_revenue",
                        "vid_views",
                        "vid_watch_time_minutes",
                        "vid_avg_view_duration",
                        "vid_impressions",
                        "vid_impressions_ctr",
                        "vid_subscribers_gained",
                        "vid_net_subscribers",
                        "vid_breakout_score",
                        "soc_posts_published",
                        "soc_impressions",
                        "soc_engagements",
                        "soc_engagement_rate",
                        "soc_meta_impressions",
                        "soc_meta_engagements",
                        "soc_meta_engagement_rate",
                        "soc_fb_impressions",
                        "soc_fb_engagements",
                        "soc_fb_engagement_rate",
                        "soc_ig_impressions",
                        "soc_ig_reach",
                        "soc_ig_engagements",
                        "soc_ig_engagement_rate",
                        "soc_ig_profile_visits",
                        "soc_ig_new_follows",
                        "sys_produced",
                        "hyros_attributed_revenue",
                        "hyros_attributed_leads",
                        "web_sessions",
                        "web_active_users",
                        "web_conversions",
                        "web_revenue",
                        "web_search_impressions",
                        "web_search_clicks",
                        "web_search_ctr",
                        "web_search_position",
                        "site_views",
                        "site_visitors",
                        "site_sessions",
                        "site_conversions",
                        "site_conversion_rate"
                      ]
                    }
                  },
                  "grain": {
                    "description": "How the numbers are bucketed. Use 'day' for a chart unless they asked for weeks or months.",
                    "type": "string",
                    "enum": [
                      "hour",
                      "day",
                      "week",
                      "month",
                      "quarter",
                      "year",
                      "lifetime"
                    ]
                  },
                  "window_periods": {
                    "description": "How far back it looks, counted in `grain` periods. 'the last 28 days' with grain=day is 28.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 366
                  },
                  "compare": {
                    "description": "What it compares against. 'previous_period' is the usual answer; 'none' shows a bare number.",
                    "type": "string",
                    "enum": [
                      "none",
                      "previous_period",
                      "same_period_last_year"
                    ]
                  },
                  "entity": {
                    "description": "The thing a monitor watches, e.g. {kind: 'ad_set', id: '...'}. Required for that kind.",
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "minLength": 1
                      },
                      "id": {
                        "type": "string",
                        "minLength": 1
                      }
                    },
                    "required": [
                      "kind",
                      "id"
                    ],
                    "additionalProperties": false
                  },
                  "condition": {
                    "description": "The 'tell me when' threshold. 'no_change_for' takes a number of days as its value.",
                    "type": "object",
                    "properties": {
                      "metric_key": {
                        "type": "string",
                        "enum": [
                          "rev_leads",
                          "rev_booked_calls",
                          "rev_calls_showed",
                          "rev_show_rate",
                          "rev_sales_won",
                          "rev_revenue_won",
                          "rev_revenue_by_source",
                          "rev_open_pipeline_value",
                          "email_sent",
                          "email_delivered",
                          "email_delivery_rate",
                          "email_opened",
                          "email_open_rate",
                          "email_clicked",
                          "email_click_rate",
                          "email_replied",
                          "email_complaint_rate",
                          "email_bounce_rate",
                          "list_size",
                          "list_new_subscribers",
                          "list_unsubscribe_rate",
                          "ads_spend",
                          "ads_impressions",
                          "ads_clicks",
                          "ads_ctr",
                          "ads_cpc",
                          "ads_cpm",
                          "ads_reach",
                          "ads_frequency",
                          "ads_conversions",
                          "ads_cost_per_lead",
                          "ads_cost_per_booked_call",
                          "ads_attributed_revenue",
                          "vid_views",
                          "vid_watch_time_minutes",
                          "vid_avg_view_duration",
                          "vid_impressions",
                          "vid_impressions_ctr",
                          "vid_subscribers_gained",
                          "vid_net_subscribers",
                          "vid_breakout_score",
                          "soc_posts_published",
                          "soc_impressions",
                          "soc_engagements",
                          "soc_engagement_rate",
                          "soc_meta_impressions",
                          "soc_meta_engagements",
                          "soc_meta_engagement_rate",
                          "soc_fb_impressions",
                          "soc_fb_engagements",
                          "soc_fb_engagement_rate",
                          "soc_ig_impressions",
                          "soc_ig_reach",
                          "soc_ig_engagements",
                          "soc_ig_engagement_rate",
                          "soc_ig_profile_visits",
                          "soc_ig_new_follows",
                          "sys_produced",
                          "hyros_attributed_revenue",
                          "hyros_attributed_leads",
                          "web_sessions",
                          "web_active_users",
                          "web_conversions",
                          "web_revenue",
                          "web_search_impressions",
                          "web_search_clicks",
                          "web_search_ctr",
                          "web_search_position",
                          "site_views",
                          "site_visitors",
                          "site_sessions",
                          "site_conversions",
                          "site_conversion_rate"
                        ]
                      },
                      "operator": {
                        "type": "string",
                        "enum": [
                          "above",
                          "below",
                          "no_change_for"
                        ]
                      },
                      "value": {
                        "type": "number"
                      }
                    },
                    "required": [
                      "metric_key",
                      "operator",
                      "value"
                    ],
                    "additionalProperties": false
                  },
                  "link_target_kind": {
                    "description": "For a link: what it opens — a site, a page, a board (or project), or a Data table. Required for that kind.",
                    "type": "string",
                    "enum": [
                      "page",
                      "site",
                      "board",
                      "data_table"
                    ]
                  },
                  "link_target_id": {
                    "description": "For a link: the id of the thing it opens, read from a tool that listed it — a link to an id that does not resolve is a dead widget.",
                    "type": "string",
                    "minLength": 1
                  },
                  "note_body": {
                    "description": "For a note: what it says, in their words where you have them. Markdown renders. Required for that kind.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 8000
                  },
                  "site_id": {
                    "description": "For site_* numbers only: narrow it to one of their sites, by its id from `page.list` — never an invented id. Add page_path for one page of it.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "page_path": {
                    "description": "For site_* numbers only: narrow it to one page by its path, like /pricing — that path on every site unless site_id is also given.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 1024
                  },
                  "label": {
                    "description": "For a button or a switch: the words on it.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "press_tool": {
                    "description": "For a button that presses a tool: the tool's name, like 'briefing.regenerate'. Pressing it runs that tool behind the tool's own approval.",
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_]*(?:\\.[a-z][a-z0-9_]*)+$"
                  },
                  "press_automation_id": {
                    "description": "For a button that starts an automation: its id, read from a tool that listed it.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "switch_automation_id": {
                    "description": "For a switch that turns an automation on and off: its id, read from a tool that listed it.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "switch_data_table_id": {
                    "description": "For a switch on one yes/no cell: the Data table's id. Pass switch_row_id and switch_column with it.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "switch_row_id": {
                    "description": "For a switch on one yes/no cell: the row's id.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "switch_column": {
                    "description": "For a switch on one yes/no cell: the column's key.",
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_]{0,63}$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "widget_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "widget_id": {
                          "type": "string"
                        },
                        "board_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "board_id",
                        "widget_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/widget.set_expiry": {
      "post": {
        "operationId": "call_widget_set_expiry",
        "summary": "Call widget.set_expiry",
        "description": "Change how long a widget stays up — 'keep that one another month', 'actually, leave it up for good' — extend it, shorten it, or let it stand. Pass expires_in_days or keep_forever, exactly one. It changes nothing else about the widget. Not for changing what it shows — that is `widget.update`.\n\nEvery 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.",
        "tags": [
          "widget"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "widget_id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The widget's id, from `widget.list`. Never an id you did not read."
                  },
                  "expires_in_days": {
                    "description": "Take it down this many days from now. Omit — and pass keep_forever — to let it stand instead.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 366
                  },
                  "keep_forever": {
                    "description": "True to clear the expiry, so the widget stands until they remove it.",
                    "type": "boolean"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "widget_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "widget_id": {
                          "type": "string"
                        },
                        "board_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "board_id",
                        "widget_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/widget.bind": {
      "post": {
        "operationId": "call_widget_bind",
        "summary": "Call widget.bind",
        "description": "Set what one placement of a widget reads — 'on the Client project, have that chart read the Client leads table', 'make the revenue number on my desk add up all three brands' — so the same widget reads different data in different places. Name the desk or project whose copy changes, then data_table_id for a Data table, workspace_ids for the brands to add together, or clear to go back to the widget's own default. Its other places keep what they read. Not for changing the widget itself everywhere — that is `widget.update`.\n\nEvery 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.",
        "tags": [
          "widget"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "widget_id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The widget's id, from `widget.list`. Never an id you did not read."
                  },
                  "board_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "data_table_id": {
                    "description": "The Data table this placement reads, by its id from a tool that listed it.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace_ids": {
                    "description": "The brands whose numbers this placement adds together, by their workspace ids.",
                    "minItems": 1,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                    }
                  },
                  "clear": {
                    "description": "True to drop this placement's own binding, so it reads what the widget reads by default.",
                    "type": "boolean"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "widget_id",
                  "board_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "widget_id": {
                          "type": "string"
                        },
                        "board_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "board_id",
                        "widget_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/desk.restore_defaults": {
      "post": {
        "operationId": "call_desk_restore_defaults",
        "summary": "Call desk.restore_defaults",
        "description": "Put the Dashboard's default desks back the way they started — 'reset Today to the default', 'put the Analytics tab back how it was', 'bring back the Today tab I deleted'. Pass the desks to rebuild: Today, Analytics or both. Each one gets its starting widgets again: the desk as it is now goes to the Trash with everything on it, restorable for 30 days, and a fresh one takes its place among the tabs; a default desk that was removed is made again. The member's own desks are never touched. Calling it always raises the approval card first, and the desks change only once the member approves. Not for a question about what a reset would change — answer it from the desk's widgets in `widget.list` and change nothing; not for taking one widget off a desk — that is `item.trash`; not for bringing a trashed desk back as it was — that is `board.restore`. 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.\n\nEvery 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.",
        "tags": [
          "desk"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "desks": {
                    "minItems": 1,
                    "maxItems": 2,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "today",
                        "analytics"
                      ]
                    },
                    "description": "The default desks to rebuild: today for the Today tab, analytics for the Analytics tab, or both."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "desks"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "restored": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "desk": {
                                "type": "string",
                                "enum": [
                                  "today",
                                  "analytics"
                                ]
                              },
                              "board_id": {
                                "type": "string"
                              },
                              "name": {
                                "type": "string"
                              },
                              "replaced": {
                                "type": "boolean",
                                "description": "True when the old desk went to the Trash; false when it had been removed and was made again."
                              }
                            },
                            "required": [
                              "desk",
                              "board_id",
                              "name",
                              "replaced"
                            ],
                            "additionalProperties": false
                          },
                          "description": "Each rebuilt desk, by its new id."
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/board.attach_set": {
      "post": {
        "operationId": "call_board_attach_set",
        "summary": "Call board.attach_set",
        "description": "'file the week of March 2 posts under the Spring launch project', 'make Q3 retargeting campaign live in the Retargeting project' — make one project of this workspace the home of a posts set (a posts week or rotation) or an ad campaign that has no project yet. The set's posts or ads stay where they are; the project becomes the place the set opens from. A set already at home in another project is refused and left as it is, and repeating the same link changes nothing. Make the project first with `projects.create` if it does not exist. Not for putting a board inside a project — that is `work.file`.\n\nEvery 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.",
        "tags": [
          "board"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The project that becomes the set's home, as `board.tree` or `projects.create` returned it."
                  },
                  "set_kind": {
                    "type": "string",
                    "enum": [
                      "posts_set",
                      "ad_campaign"
                    ],
                    "description": "`posts_set` for a posts week or rotation, `ad_campaign` for an ad campaign."
                  },
                  "set_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The posts set's or the ad campaign's id."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "board_id",
                  "set_kind",
                  "set_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "board_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "set_kind": {
                          "type": "string",
                          "enum": [
                            "posts_set",
                            "ad_campaign"
                          ]
                        },
                        "set_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "attached": {
                          "type": "boolean",
                          "description": "true when this call linked them, false when the set already had this project as its home."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "attached",
                        "board_id",
                        "set_id",
                        "set_kind",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/funnel.plan": {
      "post": {
        "operationId": "call_funnel_plan",
        "summary": "Call funnel.plan",
        "description": "Write the plan for a funnel — 'plan a funnel for our webinar', 'what would a lead funnel for this offer need?' — what it needs, in what order, where the operator decides, and how each part will be proven. Ask the few questions that matter first (the offer, who it is for, where the traffic comes from, what counts as a conversion, how long the follow-up runs), state a default rather than asking a fifth time, and stop when you have enough. It creates NOTHING: the plan is text they read and change before anything is built. Not for creating the funnel's project once they agree — that is `funnel.scaffold`.\n\nEvery 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.",
        "tags": [
          "funnel"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "answers": {
                    "type": "object",
                    "properties": {
                      "offer": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 600,
                        "description": "What they are selling, in their own words. Ask for this first — everything else follows from it."
                      },
                      "audience": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 600,
                        "description": "Who the offer is for."
                      },
                      "entry_point": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 600,
                        "description": "Where the traffic comes from — ads, organic, cold email, referral. If they have not said, state the default and move on."
                      },
                      "conversion_event": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 600,
                        "description": "The one thing that counts as a conversion — a booked call, a purchase, a form fill."
                      },
                      "follow_up_window": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 600,
                        "description": "How long the follow-up runs, e.g. 14 days. Default it and say so rather than asking a fifth question they do not care about."
                      }
                    },
                    "required": [
                      "offer",
                      "audience",
                      "entry_point",
                      "conversion_event",
                      "follow_up_window"
                    ],
                    "additionalProperties": false
                  },
                  "parts": {
                    "minItems": 1,
                    "maxItems": 7,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "landing_pages",
                        "email_sequences",
                        "pipeline",
                        "automations",
                        "creative",
                        "tracking",
                        "data_table"
                      ]
                    },
                    "description": "Which parts this funnel needs. Choose from the closed list — you cannot invent one. A funnel with a page and a sequence is a real funnel; do not add parts nobody asked for."
                  },
                  "defaulted": {
                    "description": "Which of the five answers YOU supplied rather than the operator. The plan marks each one so they can see what they never actually decided. Leave it out when they answered everything.",
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "offer",
                        "audience",
                        "entry_point",
                        "conversion_event",
                        "follow_up_window"
                      ]
                    }
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "answers",
                  "parts"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "plan_markdown": {
                          "type": "string"
                        },
                        "project_name": {
                          "type": "string"
                        },
                        "ordered_parts": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string"
                              },
                              "label": {
                                "type": "string"
                              },
                              "depends_on": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              }
                            },
                            "required": [
                              "key",
                              "label",
                              "depends_on"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "missing_dependencies": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "missing_dependencies",
                        "ordered_parts",
                        "plan_markdown",
                        "project_name",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/funnel.scaffold": {
      "post": {
        "operationId": "call_funnel_scaffold",
        "summary": "Call funnel.scaffold",
        "description": "Create the project for a funnel the operator has agreed to — 'yes, set that funnel up', 'build the project for this plan': the funnel's project, the plan saved on it as its brief, and one document per part on that project, in build order, holding that part's section of the plan. Nothing else is made — no pages, no emails, no creative. Only call it after they have read the plan and said yes. Not for writing or changing the plan — that is `funnel.plan`.\n\nEvery 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.",
        "tags": [
          "funnel"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "plan_markdown": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The plan text the operator agreed to — the one funnel.plan produced, with whatever they changed in it. Never a plan you rewrote on your own."
                  },
                  "project_name": {
                    "type": "string",
                    "minLength": 1,
                    "description": "What to call the project. Take it from the plan unless the operator named it themselves."
                  },
                  "parts": {
                    "minItems": 1,
                    "maxItems": 7,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "landing_pages",
                        "email_sequences",
                        "pipeline",
                        "automations",
                        "creative",
                        "tracking",
                        "data_table"
                      ]
                    },
                    "description": "The same parts the plan covers. Each part gets one document on the project, holding that part's section of the plan, in build order."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "plan_markdown",
                  "project_name",
                  "parts"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "project_board_id": {
                          "type": "string"
                        },
                        "project_name": {
                          "type": "string"
                        },
                        "plan_document_id": {
                          "type": "string"
                        },
                        "parts": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string"
                              },
                              "label": {
                                "type": "string"
                              },
                              "board_id": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "key",
                              "label",
                              "board_id"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "parts",
                        "plan_document_id",
                        "project_board_id",
                        "project_name",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.launch_check": {
      "post": {
        "operationId": "call_ads_launch_check",
        "summary": "Call ads.launch_check",
        "description": "Check whether one campaign is ready to go live — the ad account, a way to pay, where clicks land, the words, what it spends, and whether every ad is drawn. If they say 'this campaign' and name no id, CALL IT WITH NO ARGUMENTS: it resolves the campaign whose page they are on, and refuses plainly when there is none. Never ask which campaign before trying that. It reads only: it changes nothing, approves nothing and launches nothing. Not for drawing or changing the ads, or for whether an approved launch landed ('did it land on Meta?') — those are the campaign's board and `ads.read_board`.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "campaign_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The campaign's id, as given in this conversation or its URL."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "verdict": {
                          "type": "string"
                        },
                        "needs_you": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "rows": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string"
                              },
                              "title": {
                                "type": "string"
                              },
                              "state": {
                                "type": "string",
                                "enum": [
                                  "green",
                                  "amber"
                                ]
                              },
                              "sentence": {
                                "type": "string"
                              },
                              "action_label": {
                                "type": "string"
                              },
                              "action_href": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "key",
                              "title",
                              "state",
                              "sentence",
                              "action_label",
                              "action_href"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "needs_you",
                        "rows",
                        "verdict",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.build_audience": {
      "post": {
        "operationId": "call_ads_build_audience",
        "summary": "Call ads.build_audience",
        "description": "Create a new, empty customer audience for this brand — 'make an audience from our customer list', 'set up a new audience'. Create an empty customer audience for this brand. It has nobody in it yet — the operator adds their customer list on the audiences page, and that step stops for a person to approve. Never claim the audience has people in it. Not for an audience of people who resemble existing customers — that is `ads.build_lookalike`.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "description": "What to call the audience, in the operator's own words."
                  },
                  "description": {
                    "description": "An optional note about who is in it.",
                    "type": "string"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "name"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "audience_count": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "audiences": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "name": {
                                "type": "string"
                              },
                              "kind": {
                                "type": "string",
                                "enum": [
                                  "customer_list",
                                  "lookalike"
                                ]
                              },
                              "approximate_size": {
                                "anyOf": [
                                  {
                                    "type": "integer",
                                    "minimum": 0
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "id",
                              "name",
                              "kind",
                              "approximate_size"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "audience_count",
                        "audiences",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.build_lookalike": {
      "post": {
        "operationId": "call_ads_build_lookalike",
        "summary": "Call ads.build_lookalike",
        "description": "Ask the ad platform to find people who resemble one of this brand's audiences — 'build a lookalike audience from our customers', 'find people like our best customers'. Ask the ad platform to build a new audience of people who resemble one of this brand's customer lists. Nothing about the customers leaves us — the ad platform models from the audience it already holds. The new audience has no size until the platform finishes building it, so never state a size you were not given. Not for a new, empty customer audience — that is `ads.build_audience`.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "source_audience_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The audience's id, as listed on the audiences page."
                  },
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "description": "What to call the new lookalike."
                  },
                  "country": {
                    "type": "string",
                    "minLength": 2,
                    "maxLength": 2,
                    "description": "Two-letter country code the lookalike is built within, e.g. US."
                  },
                  "percent": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 20,
                    "description": "How close a match, as a whole percent from 1 to 20. 1 is the closest and smallest; 20 is the broadest."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "source_audience_id",
                  "name",
                  "country",
                  "percent"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "audience_count": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "audiences": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "name": {
                                "type": "string"
                              },
                              "kind": {
                                "type": "string",
                                "enum": [
                                  "customer_list",
                                  "lookalike"
                                ]
                              },
                              "approximate_size": {
                                "anyOf": [
                                  {
                                    "type": "integer",
                                    "minimum": 0
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "id",
                              "name",
                              "kind",
                              "approximate_size"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "audience_count",
                        "audiences",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.attach_audience": {
      "post": {
        "operationId": "call_ads_attach_audience",
        "summary": "Call ads.attach_audience",
        "description": "Aim a live ad set at one of this brand's audiences — 'target this ad set at our returning customers audience'. Point a live ad set at one of this brand's audiences. It REPLACES whatever audiences that ad set is targeting, and it changes who a live budget reaches — so it needs a person to approve first. If it comes back waiting for approval, say exactly that and do not describe the ad set as changed. Not for creating the audience itself — that is `ads.build_audience`.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "audience_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The audience's id, as listed on the audiences page."
                  },
                  "ad_set_id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The ad set's id on the ad platform."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "audience_id",
                  "ad_set_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "ad_set_id": {
                          "type": "string"
                        },
                        "audience_ids": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "platform_audience_expansion": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "ad_set_id",
                        "audience_ids",
                        "platform_audience_expansion",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.plan": {
      "post": {
        "operationId": "call_ads_plan",
        "summary": "Call ads.plan",
        "description": "Read back the campaign built from the brief answers so far — 'show me the plan', 'what will this campaign look like', 'make it five ads'. Propose the campaign from the answers recorded so far. Pass concept_count only when the person names how many ads they want; without it the plan proposes Goosy's default, and the answer's concept_count is the number planned. This creates nothing and spends nothing — it is the read-back a person accepts, and each planned ad is drawn and paid for only after that. Call it only once every question is answered; it will tell you which one is still open otherwise. Not for accepting the plan once the person agrees — that is `ads.accept_plan`.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "run_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The brief's run id, as given in this conversation."
                  },
                  "concept_count": {
                    "description": "How many ads to plan, only when the person names a number ('make it five ads'). Leave it out for Goosy's default. A number past the most one board draws is held to it; the answer's concept_count is what was planned.",
                    "type": "integer",
                    "exclusiveMinimum": 0
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "run_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "ready": {
                          "type": "boolean",
                          "description": "False when a question is still open — then nothing is planned."
                        },
                        "campaign_name": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "readback": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "concept_count": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "daily_budget_cents": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "audience_lines": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "open_questions": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "audience_lines",
                        "campaign_name",
                        "concept_count",
                        "daily_budget_cents",
                        "open_questions",
                        "readback",
                        "ready",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.spend_statement": {
      "post": {
        "operationId": "call_ads_spend_statement",
        "summary": "Call ads.spend_statement",
        "description": "Read this brand's fee-transparent ad statement for one month — 'what did we spend on ads last month?', 'show me our ad statement for August' — what they paid each ad platform directly, and what they paid us, as TWO SEPARATE FIGURES. ⚠️ Always report the two separately and NEVER add them together or quote a combined total: the split is a compliance requirement, not a formatting preference, and their ad budget never passes through us. Set produce_if_missing to build a statement for a complete past month that has none yet; that is idempotent and spends nothing. The downloadable copy lives on the Ad statements page. Not for where the account's credits went — that is `billing.usage_summary`.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "period": {
                    "description": "The month, as `YYYY-MM` (e.g. `2026-03`). Omit it for the most recent period this brand has a statement for. Only a COMPLETE past month can have a statement — the month in progress cannot, because its figures are still moving.",
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "produce_if_missing": {
                    "description": "Produce the statement when that period has none yet. Safe to repeat: producing the same period again reproduces the same figures rather than creating a second statement. Leave it off to simply report that no statement exists.",
                    "type": "boolean"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "period": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "period_label": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "rows": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "platform": {
                                "type": "string",
                                "enum": [
                                  "meta",
                                  "google",
                                  "tiktok",
                                  "linkedin"
                                ]
                              },
                              "platform_spend_minor": {
                                "type": "number"
                              },
                              "our_fees_minor": {
                                "type": "number"
                              },
                              "currency": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "platform",
                              "platform_spend_minor",
                              "our_fees_minor",
                              "currency"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "available_periods": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "produced": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "available_periods",
                        "period",
                        "period_label",
                        "produced",
                        "rows",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.research_pull": {
      "post": {
        "operationId": "call_ads_research_pull",
        "summary": "Call ads.research_pull",
        "description": "See what one competitor is running as ads, longest-running first — 'what ads is our competitor running?', 'what ads is HubSpot running', 'pull up their Facebook ads', 'what are they running on Google?', 'show me their LinkedIn ads', 'what ads are they running on TikTok?'. It looks the competitor up by name in the Meta, Google, LinkedIn or TikTok ad library (the platform the member names; Meta when they name none) and returns their three longest runners: the hook, the format, how long each has run (or the date it was first seen; LinkedIn's library states neither) and a link to it in the library — the ads they keep paying for are the ones working. Each run's ad_id is what `ads.pick_reference` takes when the member wants one as a reference. This charges the workspace one lookup; a competitor pulled in the last 30 days answers from what we already have and costs nothing unless refresh is set. The ads' pictures are never stored: send the member to each run's link to see one. Not for suggesting which competitors to watch — that is `ads.suggest_competitors`. 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.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "competitor": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The competitor, in the operator's own words — a brand name. A platform-native page id or advertiser id also works when they have one."
                  },
                  "platform": {
                    "type": "string",
                    "enum": [
                      "meta",
                      "google",
                      "linkedin",
                      "tiktok"
                    ],
                    "description": "Which ad library to look in."
                  },
                  "limit": {
                    "description": "How many of their longest-running ads to keep. Defaults to three, which is what the card shows.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 10
                  },
                  "refresh": {
                    "description": "Look them up again even though we already have a recent pull saved. This SPENDS a lookup; leave it off unless the operator asked for fresh numbers.",
                    "type": "boolean"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "competitor",
                  "platform"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "advertiser_name": {
                          "type": "string"
                        },
                        "platform": {
                          "type": "string",
                          "enum": [
                            "meta",
                            "google",
                            "linkedin",
                            "tiktok"
                          ]
                        },
                        "runs": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "ad_id": {
                                "type": "string"
                              },
                              "advertiser_name": {
                                "type": "string"
                              },
                              "hook": {
                                "type": "string"
                              },
                              "format": {
                                "type": "string",
                                "enum": [
                                  "image",
                                  "video"
                                ]
                              },
                              "ran_days": {
                                "anyOf": [
                                  {
                                    "type": "integer",
                                    "minimum": 0
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "first_seen_at": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "details_url": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "ad_id",
                              "advertiser_name",
                              "hook",
                              "format",
                              "ran_days",
                              "first_seen_at",
                              "details_url"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "from_memory": {
                          "type": "boolean"
                        },
                        "pulled_at": {
                          "type": "string"
                        },
                        "read": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.suggest_competitors": {
      "post": {
        "operationId": "call_ads_suggest_competitors",
        "summary": "Call ads.suggest_competitors",
        "description": "Suggest a few competitors worth tracking — 'who are our competitors', 'suggest some competitors to watch'. Offer TWO OR THREE competitors — never six — for the operator to confirm, guessed from what you know of their brand and site. This does NOT start tracking them and does NOT look anything up: each one is recorded as a candidate waiting for the operator's yes. Give a short honest reason per name; they read it before confirming. Once they confirm, use ads.research_pull to see what that competitor is running. Not for looking up what a named competitor is running — that is `ads.research_pull`.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "candidates": {
                    "minItems": 1,
                    "maxItems": 3,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "minLength": 1,
                          "description": "The competitor's brand name, as a person would say it."
                        },
                        "platform": {
                          "type": "string",
                          "enum": [
                            "meta",
                            "google",
                            "linkedin",
                            "tiktok"
                          ],
                          "description": "Where you would look them up first."
                        },
                        "reason": {
                          "type": "string",
                          "minLength": 1,
                          "description": "One short line on why you think they are a competitor. The operator reads this before confirming."
                        }
                      },
                      "required": [
                        "name",
                        "platform",
                        "reason"
                      ],
                      "additionalProperties": false
                    },
                    "description": "Two or three names, never more. Guess from what you know of this brand and its site."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "candidates"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "candidates": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "name": {
                                "type": "string"
                              },
                              "platform": {
                                "type": "string",
                                "enum": [
                                  "meta",
                                  "google",
                                  "linkedin",
                                  "tiktok"
                                ]
                              },
                              "reason": {
                                "type": "string"
                              },
                              "confirmed": {
                                "type": "boolean",
                                "const": false
                              }
                            },
                            "required": [
                              "id",
                              "name",
                              "platform",
                              "reason",
                              "confirmed"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "already_tracked": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string"
                              },
                              "platform": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "name",
                              "platform"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "already_tracked",
                        "candidates",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.propose_knob_changes": {
      "post": {
        "operationId": "call_ads_propose_knob_changes",
        "summary": "Call ads.propose_knob_changes",
        "description": "Look at how this brand's live ads did against their target over the last week and put any budget, pause, cost-target or fresh-creative change into the review queue for a person to approve. ⚠️ It only ever PROPOSES — nothing is applied, no budget moves and no campaign changes until someone approves it in the queue. Each proposal carries the numbers behind it. Say what it proposed and what it skipped, and say plainly when there is not a full day of data yet or when the outcomes ledger could not be read, rather than reporting a quiet week. Not for changing one campaign's budget or settings directly — that is the campaign's own Budget page.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "provider": {
                    "description": "Which ad platform to review. Omit for Meta, which is the default.",
                    "type": "string",
                    "enum": [
                      "meta",
                      "google"
                    ]
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "proposed": {
                          "type": "number"
                        },
                        "window_start": {
                          "type": "string"
                        },
                        "window_end": {
                          "type": "string"
                        },
                        "complete_days": {
                          "type": "number"
                        },
                        "partial_day_excluded": {
                          "type": "boolean"
                        },
                        "outcomes_available": {
                          "type": "boolean"
                        },
                        "skipped": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "knob": {
                                "type": "string"
                              },
                              "reason": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "knob",
                              "reason"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "complete_days",
                        "outcomes_available",
                        "partial_day_excluded",
                        "proposed",
                        "skipped",
                        "window_end",
                        "window_start",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.google_settings": {
      "post": {
        "operationId": "call_ads_google_settings",
        "summary": "Call ads.google_settings",
        "description": "Check or save this brand's Google Ads settings — 'what's missing before we can run a campaign', 'save our business phone number for Google Ads'. Read this brand's Google Ads campaign settings — how Google spends the budget, the Smart campaign details, and the Performance Max assets — and save one section of them. Reading changes nothing. ⚠️ These are a real business's name, phone number, landing page and ad copy: NEVER invent any of them, always ask the operator, and read first so you can say exactly what is still missing. Nothing here reaches Google or spends anything; it is what makes a campaign creatable at all. Not for creating the campaign itself — that is `ads.create_smart_campaign` or `ads.create_pmax_campaign`. 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.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "section": {
                    "description": "Which section to SAVE. Omit it to only read what is already set — reading changes nothing.",
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "bidding",
                          "smart",
                          "pmax"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "bidding": {
                    "description": "Required when section is `bidding`. ⚠️ A Performance Max campaign only runs on `maximize_conversions` or `maximize_conversion_value`; `target_spend` is search-only and is the default every unconfigured brand has. Ads drafted on the board run on Google as display ads: they need `manual_cpc` or `maximize_conversions` and `display_business_name`, the brand's real name as the ad shows it (25 characters at most) — ask the operator, never invent it; omit it to keep the saved one.",
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "enum": [
                          "target_spend",
                          "manual_cpc",
                          "maximize_conversions",
                          "maximize_conversion_value"
                        ]
                      },
                      "target_cpa_usd_cents": {
                        "anyOf": [
                          {
                            "type": "integer",
                            "minimum": 0
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "target_roas": {
                        "anyOf": [
                          {
                            "type": "number",
                            "exclusiveMinimum": 0
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "display_business_name": {
                        "description": "The business name a display ad shows (25 characters at most). Ask the operator; omit to keep the saved one.",
                        "anyOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": [
                      "kind"
                    ],
                    "additionalProperties": false
                  },
                  "smart": {
                    "description": "Required when section is `smart`. These are a REAL business's identity, phone number, landing page and ad copy — never invent any of them; ask the operator. Give the business name OR the Business Profile location, and the landing page URL OR use_ad_optimized_profile — one of each pair, not both.",
                    "type": "object",
                    "properties": {
                      "business_name": {
                        "anyOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "business_profile_location": {
                        "anyOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "phone_country_code": {
                        "type": "string"
                      },
                      "phone_number": {
                        "type": "string"
                      },
                      "language_code": {
                        "type": "string"
                      },
                      "final_url": {
                        "anyOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "use_ad_optimized_profile": {
                        "type": "boolean"
                      },
                      "include_lead_form": {
                        "type": "boolean"
                      },
                      "headlines": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "descriptions": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "keyword_theme_constants": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "locations": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "ad_group_name": {
                        "anyOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "contains_eu_political_advertising": {
                        "description": "The operator's own answer to whether these ads contain political advertising shown in the EU. Never assume it — ask.",
                        "anyOf": [
                          {
                            "type": "boolean"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": [
                      "phone_country_code",
                      "phone_number",
                      "language_code",
                      "headlines",
                      "descriptions",
                      "keyword_theme_constants"
                    ],
                    "additionalProperties": false
                  },
                  "pmax": {
                    "description": "Required when section is `pmax`. The three image lists take the ids Google gave each picture when it was uploaded to the ad account — never a URL and never image data.",
                    "type": "object",
                    "properties": {
                      "final_urls": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "headlines": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "long_headlines": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "descriptions": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "business_name": {
                        "type": "string"
                      },
                      "logo_assets": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "marketing_image_assets": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "square_marketing_image_assets": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "asset_group_name": {
                        "anyOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "path1": {
                        "anyOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "path2": {
                        "anyOf": [
                          {
                            "type": "string"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": [
                      "final_urls",
                      "headlines",
                      "long_headlines",
                      "descriptions",
                      "business_name",
                      "logo_assets",
                      "marketing_image_assets",
                      "square_marketing_image_assets"
                    ],
                    "additionalProperties": false
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "saved_section": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "bidding_kind": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "smart_ready": {
                          "type": "boolean"
                        },
                        "pmax_ready": {
                          "type": "boolean"
                        },
                        "smart_missing": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "pmax_missing": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.accept_plan": {
      "post": {
        "operationId": "call_ads_accept_plan",
        "summary": "Call ads.accept_plan",
        "description": "Accept the plan and set up the campaign — 'looks good, go with that', 'yes, make the campaign', 'go with four ads'. Accepts the plan `ads.plan` read back for this brief: it makes the campaign and its board with the plan's ads, budget and dates, and returns the campaign_id the board's tools take. Pass concept_count whenever the person named a number of ads in this conversation, and campaign_name only when they renamed it. It draws no ads and spends nothing — drawing them is the next step, and the campaign's board starts that drawing by itself when it opens — and accepting again refreshes the same campaign rather than making a second. Not for drawing the ads — that is `ads.draft_creatives`.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "run_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The brief's run id, as `ads.start_brief` returned it."
                  },
                  "campaign_name": {
                    "description": "A new name for the campaign, only when the person gives one. Leave it out to keep the plan's name.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120
                  },
                  "concept_count": {
                    "description": "How many ads: the number the person agreed to in this conversation, whether they said it with the accept ('go with four') or on an earlier read-back ('make it two'). Leave it out only when they never named one.",
                    "type": "integer",
                    "exclusiveMinimum": 0
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "run_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "campaign_id": {
                          "type": "string",
                          "description": "The campaign's id — pass it to `ads.draft_creatives`."
                        },
                        "board_path": {
                          "type": "string",
                          "description": "Where the board is, e.g. /ads/<id>."
                        },
                        "campaign_name": {
                          "type": "string"
                        },
                        "concept_count": {
                          "type": "integer",
                          "minimum": 0,
                          "description": "How many ads the board will hold once they are drawn."
                        },
                        "daily_budget_cents": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "created": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "board_path",
                        "campaign_id",
                        "campaign_name",
                        "concept_count",
                        "created",
                        "daily_budget_cents",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.keep": {
      "post": {
        "operationId": "call_ads_keep",
        "summary": "Call ads.keep",
        "description": "Keep ads for the launch, or set them aside — 'keep that ad', 'keep the second and third ones', 'drop the blue one', 'lose the rest'. Records the person's pick on the campaign's board: the kept ads are the ones the launch sends, and a set-aside ad stays on the board and can be kept again later. Name each ad by the creative_id the board's tools returned. Only this call keeps an ad: never tell them an ad is kept or set aside unless this tool's result lists it. It draws nothing, spends nothing and sends nothing. Not for drawing more ads like one they like — that is `ads.more_like_this`.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "campaign_id": {
                    "description": "The campaign's id. Leave it out to use the campaign the person is looking at.",
                    "type": "string"
                  },
                  "creative_ids": {
                    "minItems": 1,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                      "description": "One ad's id on the board, as the board's tools returned it."
                    },
                    "description": "The ads the person named, one id each."
                  },
                  "decision": {
                    "type": "string",
                    "enum": [
                      "keep",
                      "set_aside"
                    ],
                    "description": "keep puts the ads in what launches; set_aside takes them out. Either can be changed back."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "creative_ids",
                  "decision"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "kept": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          },
                          "description": "The ads now kept."
                        },
                        "set_aside": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          },
                          "description": "The ads now set aside."
                        },
                        "not_changed": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "creative_id": {
                                "type": "string"
                              },
                              "reason": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "creative_id",
                              "reason"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "kept",
                        "not_changed",
                        "set_aside",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.set_words": {
      "post": {
        "operationId": "call_ads_set_words",
        "summary": "Call ads.set_words",
        "description": "Change the words on one ad — 'make the headline say Spring sale ends Friday', 'change the button to Book now', 'shorten the main text'. Replaces one line of one ad's words — the headline, the main text, the description or the button — with the person's own words, exactly as they give them, and saves it at once. Name the ad by the creative_id the board's tools returned. The picture is not redrawn and nothing is spent; a line that would put our own plumbing word 'ad set' on the ad is refused with the reason. Not for a new picture of the same ad — that is `ads.recompose_crop`.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "campaign_id": {
                    "description": "The campaign's id. Leave it out to use the campaign the person is looking at.",
                    "type": "string"
                  },
                  "creative_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "One ad's id on the board, as the board's tools returned it."
                  },
                  "field": {
                    "type": "string",
                    "enum": [
                      "headline",
                      "primary_text",
                      "description",
                      "call_to_action"
                    ],
                    "description": "Which line: headline (the bold line), primary_text (the main text above the picture), description (the line under the headline) or call_to_action (the button's words)."
                  },
                  "text": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The new line exactly as the person wants it — their words, never a rewrite of them."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "creative_id",
                  "field",
                  "text"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "creative_id": {
                          "type": "string"
                        },
                        "field": {
                          "type": "string",
                          "enum": [
                            "headline",
                            "primary_text",
                            "description",
                            "call_to_action"
                          ]
                        },
                        "text": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "creative_id",
                        "field",
                        "text",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.set_budget": {
      "post": {
        "operationId": "call_ads_set_budget",
        "summary": "Call ads.set_budget",
        "description": "Set what a campaign spends and for how long, or how many ads it tries — 'make it $40 a day', 'run it for two weeks from Monday', 'no end date', 'try five ads instead'. Saves the daily amount in dollars, the first and last day, or the ad count onto the campaign's Budget step; anything not named stays as it is. Nothing spends until the campaign launches, and a higher ad count draws nothing by itself. A campaign that is already live is refused. Not for launching the campaign — that is `ads.approve_launch`.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "campaign_id": {
                    "description": "The campaign's id. Leave it out to use the campaign the person is looking at.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "daily_budget_dollars": {
                    "description": "The daily amount in DOLLARS, e.g. 40 for $40 a day — never cents. Leave it out to keep the current amount.",
                    "type": "number",
                    "exclusiveMinimum": 0
                  },
                  "starts_on": {
                    "description": "The first day, YYYY-MM-DD, only when the person names one. Leave it out to keep the current start.",
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                  },
                  "ends_on": {
                    "description": "The last day, YYYY-MM-DD, only when the person names one. Leave it out to keep the current end.",
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                  },
                  "run_until_paused": {
                    "description": "true only when the person wants no end date — the campaign then runs until they pause it.",
                    "type": "boolean"
                  },
                  "ad_count": {
                    "description": "How many ads the campaign should try, only when the person names a number. It draws nothing by itself.",
                    "type": "integer",
                    "exclusiveMinimum": 0
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "daily_budget_cents": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "total_cents": {
                          "anyOf": [
                            {
                              "type": "integer",
                              "minimum": 0
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "starts_on": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "ends_on": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "ad_count": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "ad_count",
                        "daily_budget_cents",
                        "ends_on",
                        "starts_on",
                        "total_cents",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.more": {
      "post": {
        "operationId": "call_ads_more",
        "summary": "Call ads.more",
        "description": "Draw more ads when the campaign's ads run asks 'Want more?' — '3 more, warmer', 'give me two more about the price', 'draw a few more'. Answers yes to that question with how many and, in the person's own words, what to do differently, and the run draws them: a picture and its words for each. It STARTS the drawing and returns; the new ads land over the next few minutes. Each new ad costs one image generation, plus a redraw of any picture the quality check turns back. Not for more ads like one particular ad — that is `ads.more_like_this`. 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.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "campaign_id": {
                    "description": "The campaign's id. Leave it out to use the campaign the person is looking at.",
                    "type": "string"
                  },
                  "count": {
                    "description": "How many more ads to draw, as the person says it ('3 more' is 3). Leave it out for three.",
                    "type": "integer",
                    "exclusiveMinimum": 0
                  },
                  "direction": {
                    "description": "What to do differently this time, in the person's own words ('warmer', 'more about the price'), only when they say it.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 500
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "answered": {
                          "type": "boolean"
                        },
                        "count": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "direction": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "status": {
                          "type": "string",
                          "const": "drawing"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.done": {
      "post": {
        "operationId": "call_ads_done",
        "summary": "Call ads.done",
        "description": "End the ads run when they want no more ads — 'no more ads', 'I'm done drawing', 'that's enough ads', 'not these ideas'. Call it on those words, with no read first: it answers no to the run's open question — on 'Want more?' the run finishes with the ads it has; on the planned ideas before any picture is drawn, it draws none of them — and its result says which. Only this call ends the run: never tell them no more ads are coming, or that the run is closed, without this tool's result. Nothing is drawn, spent or sent. Not for setting ads aside one by one — that is `ads.keep`.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "campaign_id": {
                    "description": "The campaign's id. Leave it out to use the campaign the person is looking at.",
                    "type": "string"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "answered": {
                          "type": "boolean"
                        },
                        "question": {
                          "type": "string",
                          "enum": [
                            "the_ideas",
                            "want_more"
                          ],
                          "description": "the_ideas: the planned ideas were turned down and nothing is drawn; want_more: the run finishes with the ads it has."
                        },
                        "next": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answered",
                        "next",
                        "question",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.read_board": {
      "post": {
        "operationId": "call_ads_read_board",
        "summary": "Call ads.read_board",
        "description": "Read a campaign's targeting, sizes and launch — 'what is it targeting', 'who sees it', 'did it land on Meta?', 'where do the ad sizes stand?'. Returns its targeting (who it reaches, the places it runs and the age band), its ads, each by its creative_id with its words and whether it is kept and drawn, the planned ideas while they wait for a yes, what the campaign's ads run is doing now, its sizes made of needed, its start date, and where its launch is — waiting on an approve, still on its way, on the platform paused with the platform's own campaign id, or refused with the reason. Call it in this turn for every question about who the campaign reaches or where it runs ('where does it run'), its ads ('what ads do we have'), its sizes or an approved launch ('did it launch?', 'did it go through?'), and answer from this read — never from an earlier reply, and never by raising the launch card again. Leave campaign_id out to read the campaign on screen; the platform's own campaign id is never a campaign_id. Call it before keeping, setting aside or rewording ads by their place ('the first one'), so each is named by its creative_id. It reads only: it changes, draws and spends nothing — when they asked to keep, set aside or reword, call `ads.keep` or `ads.set_words` next, in the same turn, and say it is done only from that tool's result. Not for whether the campaign is ready to launch — that is `ads.launch_check`.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "campaign_id": {
                    "description": "The campaign's id. Leave it out to use the campaign the person is looking at.",
                    "type": "string"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "campaign_id": {
                          "type": "string"
                        },
                        "campaign_name": {
                          "type": "string"
                        },
                        "platform": {
                          "type": "string"
                        },
                        "run": {
                          "type": "string",
                          "enum": [
                            "not_started",
                            "drawing",
                            "waiting_on_the_ideas",
                            "waiting_on_want_more",
                            "finished",
                            "failed"
                          ],
                          "description": "waiting_on_the_ideas: the planned ideas wait for a yes (`ads.draft_creatives`) before any picture is drawn; waiting_on_want_more: the run asks whether to draw more (`ads.more` or `ads.done`)."
                        },
                        "ideas": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "ads": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "creative_id": {
                                "type": "string"
                              },
                              "position": {
                                "type": "integer"
                              },
                              "name": {
                                "type": "string"
                              },
                              "kept": {
                                "type": "boolean"
                              },
                              "drawn": {
                                "type": "boolean"
                              },
                              "headline": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "primary_text": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "call_to_action": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "creative_id",
                              "position",
                              "name",
                              "kept",
                              "drawn",
                              "headline",
                              "primary_text",
                              "description",
                              "call_to_action"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "daily_budget_cents": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "ad_count": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "live": {
                          "type": "boolean"
                        },
                        "sizes": {
                          "type": "object",
                          "properties": {
                            "made": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "needed": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "drawing": {
                              "type": "integer",
                              "minimum": 0
                            }
                          },
                          "required": [
                            "made",
                            "needed",
                            "drawing"
                          ],
                          "description": "The sizes the platform needs for the kept ads, counted from the campaign's own rows: made of needed, and how many are on their way. When made equals needed every size is done — never say the sizes are still open. Sizes not yet made are Goosy's, made at the approve, never the person's.",
                          "additionalProperties": false
                        },
                        "starts_on": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "targeting": {
                          "type": "object",
                          "properties": {
                            "audience": {
                              "type": "string"
                            },
                            "places": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "ages": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": [
                            "audience",
                            "places",
                            "ages"
                          ],
                          "additionalProperties": false
                        },
                        "platform_campaign": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "label": {
                                  "type": "string"
                                },
                                "id": {
                                  "type": "string"
                                }
                              },
                              "required": [
                                "label",
                                "id"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "launch": {
                          "type": "object",
                          "properties": {
                            "state": {
                              "type": "string",
                              "enum": [
                                "not_approved",
                                "in_flight",
                                "on_platform_paused",
                                "on_platform_scheduled",
                                "on_platform_live",
                                "refused"
                              ],
                              "description": "not_approved: nothing has approved this launch and no card is up — on a launch ask call `ads.approve_launch`, which raises the card; when sentence is set the last launch was refused for that reason and approving again retries it. in_flight: approved, and the launch step has not settled — say it is still on its way. on_platform_paused: the platform has it, paused; nothing spends until it is switched on (`ads.switch_campaign`). on_platform_scheduled: switched on, and it starts serving on its start date; nothing spends before then. on_platform_live: switched on and serving; it spends its daily amount until paused. refused: the launch step refused; say its sentence."
                            },
                            "provider_campaign_id": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "sentence": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": [
                            "state",
                            "provider_campaign_id",
                            "sentence"
                          ],
                          "additionalProperties": false
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "ad_count",
                        "ads",
                        "campaign_id",
                        "campaign_name",
                        "daily_budget_cents",
                        "ideas",
                        "launch",
                        "live",
                        "platform",
                        "platform_campaign",
                        "run",
                        "sizes",
                        "starts_on",
                        "targeting",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.declare": {
      "post": {
        "operationId": "call_ads_declare",
        "summary": "Call ads.declare",
        "description": "Record whether the campaign is about credit, jobs, housing or politics — 'none of those apply', 'it is a job ad', 'it is not political'. Saves the person's own answer to the platforms' special-category question on the campaign, which Approve's launch check needs before it can run; on LinkedIn it also records their confirmation that the ad is not political advertising. Only record what the person said — this is their legal statement to the ad platform, so an empty list is sent only when they said none apply, never assumed. It is refused once a launch is waiting on an approval or already live, and nothing is sent or spent until the launch. Not for launching the campaign — that is `ads.approve_launch`.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "campaign_id": {
                    "description": "The campaign's id. Leave it out to use the campaign the person is looking at.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "categories": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "credit",
                        "employment",
                        "housing",
                        "social_issues_elections_politics"
                      ]
                    },
                    "description": "The kinds the person said this campaign is about: credit, employment (jobs), housing, or social_issues_elections_politics. An empty list records their answer that none of these apply — send it only when they said so."
                  },
                  "linkedin_not_political": {
                    "description": "LinkedIn only: true when the person confirmed the campaign is not political advertising under LinkedIn's rules, false when they withdrew that. Leave it out on other platforms.",
                    "type": "boolean"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "categories"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "categories": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "enum": [
                              "credit",
                              "employment",
                              "housing",
                              "social_issues_elections_politics"
                            ]
                          }
                        },
                        "linkedin_not_political": {
                          "anyOf": [
                            {
                              "type": "boolean"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "categories",
                        "linkedin_not_political",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.pinterest_boards": {
      "post": {
        "operationId": "call_connections_pinterest_boards",
        "summary": "Call connections.pinterest_boards",
        "description": "See the connected Pinterest account's boards — 'what Pinterest boards do we have', 'which board are pins going to'. Read the connected Pinterest account's boards and which one pins currently publish to. Call this before designating a board — the id must come from this list, never from memory or from the operator's phrasing. Not for choosing the board — that is `connections.set_pinterest_board`.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "boards": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "board_id": {
                                "type": "string"
                              },
                              "name": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "board_id",
                              "name"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "publishing_to_board_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "boards",
                        "publishing_to_board_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.set_pinterest_board": {
      "post": {
        "operationId": "call_connections_set_pinterest_board",
        "summary": "Call connections.set_pinterest_board",
        "description": "Choose which Pinterest board this brand's pins publish to — 'post our pins to the Recipes board', 'use a different Pinterest board'. The id is verified against the connected account's own boards first, so a wrong id refuses rather than retargeting the brand's pins. Nothing is published by this call — it only clears the lane's 'no board picked' refusal. Not for listing the account's boards — that is `connections.pinterest_boards`.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "type": "string",
                    "description": "A board id copied VERBATIM from connections.pinterest_boards. It is verified against the connected account's own boards before anything is stored."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "board_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "board_name": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "board_id",
                        "board_name",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.page_cta": {
      "post": {
        "operationId": "call_connections_page_cta",
        "summary": "Call connections.page_cta",
        "description": "Check the call-to-action button on this brand's Facebook Page — 'what button is on our Facebook Page', 'what does our page's button say'. Read the call-to-action button on this brand's Facebook Page — the blue button under the cover photo (Book Now, Call Now, Shop Now and so on). Call this before answering anything about the Page's button and ALWAYS before changing or removing it, so you describe what is actually there rather than what you last set. A null `call_to_action` means the Page has no button yet, which is normal. Not for changing the button — that is `connections.set_page_cta`.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "page_name": {
                          "type": "string"
                        },
                        "call_to_action": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "type": {
                                  "type": "string"
                                },
                                "status": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "web_destination_type": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "web_url": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "email_address": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "phone_number": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              },
                              "required": [
                                "type",
                                "status",
                                "web_destination_type",
                                "web_url",
                                "email_address",
                                "phone_number"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "The Page's current button, or null when the Page has no button yet. `null` is a normal state — say the Page has no button and offer to set one; never report it as an error or as a broken connection."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "call_to_action",
                        "page_name",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.set_page_cta": {
      "post": {
        "operationId": "call_connections_set_page_cta",
        "summary": "Call connections.set_page_cta",
        "description": "Choose the call-to-action button on this brand's Facebook Page — 'change our Facebook Page button to Book Now', 'set the CTA to Shop Now'. Set the call-to-action button on this brand's Facebook Page. This changes what visitors see on the live Page immediately, so read connections.page_cta first and tell the operator what it is changing FROM. The result is re-read from Facebook, so report what it says rather than what you asked for — Facebook can normalise or refuse part of a request. Not for removing the button altogether — that is `connections.clear_page_cta`.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "description": "The button label, as one of Facebook's exact values — e.g. BOOK_NOW, CALL_NOW, SHOP_NOW, SIGN_UP, LEARN_MORE, CONTACT_US, REQUEST_QUOTE, GET_DIRECTIONS. Not every Page can run every button; if Facebook refuses one, say so and offer a different one rather than retrying the same value."
                  },
                  "web_destination_type": {
                    "description": "Where the button sends people, as one of Facebook's exact values — WEBSITE for a link, EMAIL for an address, NONE for a button with no destination. Leave it out for a plain website or phone button: it is derived from what you supply. Required for an EMAIL button.",
                    "type": "string"
                  },
                  "web_url": {
                    "description": "The full https link the button opens. Required for a button that sends people to a website; leave it out for CALL_NOW.",
                    "type": "string"
                  },
                  "phone_number": {
                    "description": "For CALL_NOW: the number in full international form, starting with + (e.g. +14155550123). A national-format number dials wrong for half the callers and is refused.",
                    "type": "string"
                  },
                  "email_address": {
                    "description": "For an email-destination button: the address to open.",
                    "type": "string"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "type"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "page_name": {
                          "type": "string"
                        },
                        "operation": {
                          "type": "string",
                          "enum": [
                            "created",
                            "updated"
                          ]
                        },
                        "call_to_action": {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "string"
                            },
                            "status": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "web_destination_type": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "web_url": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "email_address": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "phone_number": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": [
                            "type",
                            "status",
                            "web_destination_type",
                            "web_url",
                            "email_address",
                            "phone_number"
                          ],
                          "additionalProperties": false
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "call_to_action",
                        "operation",
                        "page_name",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.clear_page_cta": {
      "post": {
        "operationId": "call_connections_clear_page_cta",
        "summary": "Call connections.clear_page_cta",
        "description": "Take the call-to-action button off this brand's Facebook Page — 'remove the button on our Facebook Page', 'take off the call-to-action'. Remove the call-to-action button from this brand's Facebook Page entirely. The button disappears from the live Page where the brand's own customers can see it is gone, and nothing here can put it back without being told what it was — so it PREPARES the removal and stops: it shows the operator the button it is about to take off, and only their approve removes it. Not for swapping in a different button — that is `connections.set_page_cta`. 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.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "page_name": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.health_check": {
      "post": {
        "operationId": "call_connections_health_check",
        "summary": "Call connections.health_check",
        "description": "Re-check one connection right now — 'is this connection still working', 'check if this fixed itself'. Re-probe one connection and report what the provider answered right now. Use it when the operator says something has stopped working, or to confirm a fix — connections.status reports the LAST recorded result, this one asks again. It only asks: nothing is published, no setting changes, and no credential is read or returned. Not for the whole list of connections — that is `connections.status`.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "connection_id": {
                    "type": "string",
                    "description": "The connection to re-probe, copied VERBATIM from a `connection_ids` entry returned by connections.status — call it first; the id is not derivable from a connector's name. When that card lists more than one id, or the operator's wording fits more than one card, ask which connection they mean rather than picking."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "connection_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "status": {
                          "type": "string"
                        },
                        "last_success_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "recent_error_count_24h": {
                          "type": "integer"
                        },
                        "notes": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "last_success_at",
                        "notes",
                        "recent_error_count_24h",
                        "status",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.resync_custom_connector": {
      "post": {
        "operationId": "call_connections_resync_custom_connector",
        "summary": "Call connections.resync_custom_connector",
        "description": "Re-read one of this workspace's own connectors' tool list right now — 'refresh our custom connector', 'why aren't the new tools showing up'. Re-read one of this workspace's own registered connectors' tool list, right now. Use it when the operator says they have added or changed something on their own MCP server or API and the new operations are not showing up — this asks the connector again, where the connector card reports the LAST sync. It changes no setting, reads no credential and cannot remove the connector. Read `read_ok` first: a failed read leaves the connector exactly as it was and must never be reported as a refresh. Not for checking a new address before it is set up — that is `connections.probe_connector_address`.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "connector_name": {
                    "type": "string",
                    "description": "The connector's own name — the namespace segment its tools arrive under, so `docs_search` in `connector.docs_search.search`. It is matched against this workspace's own connectors; a name that matches none refuses rather than re-syncing something else."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "connector_name"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "connector_name": {
                          "type": "string"
                        },
                        "read_ok": {
                          "type": "boolean",
                          "description": "`true` — the manifest was read and the tool list below is what the connector publishes right now. `false` — the read FAILED and NOTHING was re-stamped; the connector still exists with the tools it had. Never report a failed read as a refresh."
                        },
                        "error_code": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "The rail's typed reason when `read_ok` is false — never a credential, never an address. `null` on success."
                        },
                        "tools_observed": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "tools_updated": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "tools_now_missing": {
                          "type": "integer",
                          "minimum": 0,
                          "description": "Tools this connector used to publish and no longer does. They stay listed on the connector's card and stop being callable; say so rather than reporting them as removed."
                        },
                        "tools_not_yet_screened": {
                          "type": "integer",
                          "minimum": 0,
                          "description": "Tools the safety screen's budget did not reach this pass. They are NOT callable yet and the next sync screens them — tell the operator to try again shortly rather than that the connector is broken."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "connector_name",
                        "error_code",
                        "read_ok",
                        "tools_not_yet_screened",
                        "tools_now_missing",
                        "tools_observed",
                        "tools_updated",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page_ads.list_posts": {
      "post": {
        "operationId": "call_page_ads_list_posts",
        "summary": "Call page_ads.list_posts",
        "description": "List the posts on this brand's connected Facebook Page — 'what posts can I boost', 'show me our recent Facebook posts'. List the published posts on this brand's connected Facebook Page. Call this before talking about boosting anything — never guess a post id, and never offer to boost a post this did not return. Not for boosting a post once one is chosen — that is `page_ads.boost_post`.\n\nEvery 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.",
        "tags": [
          "page_ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "limit": {
                    "description": "How many recent posts to list. Defaults to 25.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 50
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "page_name": {
                          "type": "string"
                        },
                        "posts": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "post_id": {
                                "type": "string"
                              },
                              "message": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "created_time": {
                                "type": "string"
                              },
                              "permalink_url": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "post_id",
                              "message",
                              "created_time",
                              "permalink_url"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "page_name",
                        "posts",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page_ads.boost_post": {
      "post": {
        "operationId": "call_page_ads_boost_post",
        "summary": "Call page_ads.boost_post",
        "description": "Turn one of this Page's published posts into a boosted ad — 'boost this post', 'turn this post into an ad'. Boost one published Facebook Page post into an ad for that Page. Before it runs, the member is shown the post, the daily budget and the days on a card and approves it there. It does NOT start spending: the ad account's own spend approval still stands in front of any money, and everything it creates is PAUSED. Report the status field exactly as returned — never say the ad is live or running. Not for a post that has not gone out on the Page yet, or for drafting a new ad from a post or an idea — that is `ads.start_brief`. 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.\n\nEvery 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.",
        "tags": [
          "page_ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "post_id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The post to boost, exactly as page_ads.list_posts reported it. Never invent one."
                  },
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "description": "What to call this boost, so the operator can find it later."
                  },
                  "daily_budget_usd_cents": {
                    "type": "integer",
                    "minimum": 100,
                    "description": "The per-day budget in USD cents. At least 100 ($1.00)."
                  },
                  "duration_days": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 90,
                    "description": "How many days the boost should run (1-90)."
                  },
                  "countries": {
                    "minItems": 1,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 2,
                      "maxLength": 2
                    },
                    "description": "ISO 3166-1 alpha-2 country codes to target, e.g. [\"US\"]. Meta requires at least one."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "post_id",
                  "name",
                  "daily_budget_usd_cents",
                  "duration_days",
                  "countries"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "awaiting_approval",
                            "created_paused"
                          ]
                        },
                        "page_name": {
                          "type": "string"
                        },
                        "post_id": {
                          "type": "string"
                        },
                        "ad_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "campaign_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.recheck_accounts": {
      "post": {
        "operationId": "call_connections_recheck_accounts",
        "summary": "Call connections.recheck_accounts",
        "description": "Re-check which accounts a connection can post to, and record what the provider answers — 'my page isn't showing up as somewhere to post', 'I just connected Instagram, why can't I pick it?', 'check my accounts again'.  Re-read one connection for the accounts this brand can post to, and record them. Use it when the operator says a connected account is not showing up as somewhere to post, or right after they connect one. It only asks the provider: nothing is published, no setting changes, no credential is read or returned — and it never picks WHICH account is this brand's, it reports when that question is open. Not for whether a connection works at all — that is `connections.health_check`.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "connection_id": {
                    "type": "string",
                    "description": "The connection whose postable accounts to re-read, copied VERBATIM from a `connection_ids` entry returned by connections.status — call it first; the id is not derivable from a connector's name. When that card lists more than one id, ask which connection they mean rather than picking."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "connection_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "outcome": {
                          "type": "string"
                        },
                        "account_count": {
                          "type": "integer"
                        },
                        "added_count": {
                          "type": "integer"
                        },
                        "platforms_needing_pick": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "account_count",
                        "added_count",
                        "outcome",
                        "platforms_needing_pick",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.check_ad_account_access": {
      "post": {
        "operationId": "call_connections_check_ad_account_access",
        "summary": "Call connections.check_ad_account_access",
        "description": "Confirm we actually have access to a brand's shared ad account — 'check if the ad account access came through', 'did they finish sharing the ad account'. Ask the platform what access we ACTUALLY have on this brand's ad account right now, and record the answer. Call it when the operator says they have finished sharing the account, or asks whether it came through. It needs their ad account id already on file — connections.ad_account_status shows whether we have one. On TikTok this is what catches the common failure: TikTok's default sharing level is view-only, so a shared account often arrives with access that cannot run campaigns, and this check surfaces the step that fixes it. It only LOOKS: nothing is changed on their ad account, nothing is spent, and the only thing written is our own record of what came back — so it is always safe to run again. Not for asking the platform for access — that is `connections.request_ad_account_access`.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "platform": {
                    "type": "string",
                    "enum": [
                      "meta",
                      "google",
                      "tiktok",
                      "linkedin"
                    ],
                    "description": "Which advertising platform's ad account to set up on that platform's own account — the customer owns the account and grants us access to it. The allowed values are the enum's; do not offer a platform outside it."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "platform"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "platform": {
                          "type": "string",
                          "enum": [
                            "meta",
                            "google",
                            "tiktok",
                            "linkedin"
                          ]
                        },
                        "grant_state": {
                          "type": "string",
                          "enum": [
                            "not_started",
                            "awaiting_customer_creation",
                            "awaiting_authorization",
                            "awaiting_platform_access",
                            "request_issued",
                            "awaiting_customer_accept",
                            "active",
                            "revoked",
                            "failed"
                          ]
                        },
                        "status_sentence": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "external_account_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "next_step_key": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "next_step_title": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "steps": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "step_key": {
                                "type": "string"
                              },
                              "title": {
                                "type": "string"
                              },
                              "state": {
                                "type": "string",
                                "enum": [
                                  "pending",
                                  "done",
                                  "skipped"
                                ]
                              }
                            },
                            "required": [
                              "step_key",
                              "title",
                              "state"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "external_account_id",
                        "grant_state",
                        "next_step_key",
                        "next_step_title",
                        "platform",
                        "status_sentence",
                        "steps",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.request_ad_account_access": {
      "post": {
        "operationId": "call_connections_request_ad_account_access",
        "summary": "Call connections.request_ad_account_access",
        "description": "Ask the ad platform for access to the operator's own ad account — 'request access to our ad account', 'ask for access to this ad account id'. Ask the platform for permission to work on the operator's OWN ad account, naming the account id they gave you. This sends a real request that lands in their own business settings for approval, so pass the account id the operator gave you, never one you guessed. It requires a signed authorization to act on their behalf; calling it raises the approval card naming the account and the platform, which is the operator's confirmation, and only their approve sends it. It never moves money and never touches their card. Not for checking access we already asked for — that is `connections.check_ad_account_access`. 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.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "platform": {
                    "type": "string",
                    "enum": [
                      "meta",
                      "google",
                      "tiktok",
                      "linkedin"
                    ],
                    "description": "Which advertising platform's ad account to set up on that platform's own account — the customer owns the account and grants us access to it. The allowed values are the enum's; do not offer a platform outside it."
                  },
                  "external_account_id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The operator's OWN ad account id, exactly as the platform writes it (Meta: act_1234567890). This names WHICH account we ask about — it is an account identifier and grants nothing by itself. NEVER pass a password, token or API key here."
                  },
                  "external_business_id": {
                    "description": "Their business portfolio / Business Center id, where the platform has one. Omit unless the operator gave you one.",
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "platform",
                  "external_account_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "platform": {
                          "type": "string",
                          "enum": [
                            "meta",
                            "google",
                            "tiktok",
                            "linkedin"
                          ]
                        },
                        "grant_state": {
                          "type": "string",
                          "enum": [
                            "not_started",
                            "awaiting_customer_creation",
                            "awaiting_authorization",
                            "awaiting_platform_access",
                            "request_issued",
                            "awaiting_customer_accept",
                            "active",
                            "revoked",
                            "failed"
                          ]
                        },
                        "status_sentence": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "external_account_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "next_step_key": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "next_step_title": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "steps": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "step_key": {
                                "type": "string"
                              },
                              "title": {
                                "type": "string"
                              },
                              "state": {
                                "type": "string",
                                "enum": [
                                  "pending",
                                  "done",
                                  "skipped"
                                ]
                              }
                            },
                            "required": [
                              "step_key",
                              "title",
                              "state"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.draft_creatives": {
      "post": {
        "operationId": "call_ads_draft_creatives",
        "summary": "Call ads.draft_creatives",
        "description": "Turn an accepted campaign plan into finished ads — 'draw the ads for this campaign', 'generate the creative now'. Draw this campaign's ads from the plan it already accepted — a picture and its words for each idea. Name the campaign by its campaign_id, or by the brief's run_id once `ads.accept_plan` has accepted its plan. It STARTS the drawing and returns; the drawing carries on by itself even if they close the page, and the pictures land over the next few minutes. It costs money and only works once per campaign. Not for more ads like one that already exists (`ads.more_like_this`), for pictures that never drew (`ads.retry_draft_pictures`), or for a new ad from a post or an idea before any plan is accepted (`ads.start_brief`). 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.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "campaign_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The campaign's id, as given in this conversation or its URL."
                  },
                  "run_id": {
                    "description": "The brief's run id, when the campaign's id is not to hand; the run names the campaign its accept made.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "ideas": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "already_drawn": {
                          "type": "boolean"
                        },
                        "status": {
                          "type": "string",
                          "const": "drawing"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.recompose_crop": {
      "post": {
        "operationId": "call_ads_recompose_crop",
        "summary": "Call ads.recompose_crop",
        "description": "Redraw one ad's crop at a new shape — 'resize this ad for Stories', 'make a square version of this ad'. Redraw one of an ad's crops at its own shape, using the ad's first crop as the reference — a new picture at that shape, never a crop of the original. It costs one generation. Not for new ads in the same style — that is `ads.more_like_this`. 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.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "placement_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The crop to redraw, by its id on the ad's page."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "placement_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "placement_id": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string",
                          "const": "drawing"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.more_like_this": {
      "post": {
        "operationId": "call_ads_more_like_this",
        "summary": "Call ads.more_like_this",
        "description": "Make more ads like one that is already working — 'make more like this one', 'give me another version of this ad'. Draw more ads like one that already exists, using that ad's own picture as the reference. It STARTS the drawing and returns; the pictures land over the next minute. Each new ad costs one generation per shape the original carries. Not for the same ad at a new shape — that is `ads.recompose_crop`. 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.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "creative_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The ad to draw more of, by its id on the board."
                  },
                  "count": {
                    "description": "How many more to draw, 1 to 4 — anything higher is drawn as 4. Leave it out for 2.",
                    "type": "integer"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "creative_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "drafted": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "dispatched": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "status": {
                          "type": "string",
                          "const": "drawing"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.retry_draft_pictures": {
      "post": {
        "operationId": "call_ads_retry_draft_pictures",
        "summary": "Call ads.retry_draft_pictures",
        "description": "Finish the pictures on a campaign whose copy is done but the images never drew — 'try the pictures again', 'the images never showed up, redo them'. Ask again for the pictures on a campaign whose ads were written but never drew — the missing ones only. It STARTS the drawing and returns; the pictures land over the next few minutes. Nothing already drawn is charged again, and no words are re-written. Not for a campaign whose ads were never drawn at all — that is `ads.draft_creatives`. 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.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "campaign_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The campaign's id, as given in this conversation or its URL."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "campaign_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "leads": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "dispatched": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "status": {
                          "type": "string",
                          "const": "drawing"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/funnel.status": {
      "post": {
        "operationId": "call_funnel_status",
        "summary": "Call funnel.status",
        "description": "How far along a funnel is — 'how far along is our funnel?', 'has the funnel been tested?' — which parts have passed a test lead, which have not, and whether the whole funnel has been proven end to end. A part that has not passed reads unverified; never call one done on its behalf. Not for running a test lead through it — that is `funnel.test_part` or `funnel.test_end_to_end`.\n\nEvery 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.",
        "tags": [
          "funnel"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "project_board_id": {
                    "description": "The funnel's project id, if you have one from something you were shown. If you do not, use funnel_name instead — do not guess a uuid.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "funnel_name": {
                    "description": "What the member calls the funnel, when you do not have its id. It is matched against their own projects only.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "project_board_id": {
                          "type": "string"
                        },
                        "parts": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string"
                              },
                              "label": {
                                "type": "string"
                              },
                              "board_id": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "status": {
                                "type": "string",
                                "enum": [
                                  "unverified",
                                  "passed",
                                  "failed"
                                ]
                              },
                              "failed_at": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "key",
                              "label",
                              "board_id",
                              "status",
                              "failed_at"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "whole": {
                          "type": "string",
                          "enum": [
                            "unverified",
                            "passed",
                            "failed"
                          ]
                        },
                        "whole_failed_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "turned_on": {
                          "type": "boolean"
                        },
                        "turned_on_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "parts",
                        "project_board_id",
                        "turned_on",
                        "turned_on_at",
                        "whole",
                        "whole_failed_at",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/funnel.set_conversion_event": {
      "post": {
        "operationId": "call_funnel_set_conversion_event",
        "summary": "Call funnel.set_conversion_event",
        "description": "Record the ONE event that counts as a conversion for this funnel — 'a booked call is our conversion', 'count a purchase as the win' — in the member's own words. This is the number the funnel is judged on, so ask them and use their answer verbatim rather than choosing one. It changes no page, no pixel and no connection: it writes the decision onto the funnel's plan. Say plainly that conversions are not yet counted against the funnel in the outcomes ledger, so recording this does not by itself make the closing event observable. Not for which Google Analytics conversions the brand reports — that is `connections.set_conversion_events`.\n\nEvery 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.",
        "tags": [
          "funnel"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "project_board_id": {
                    "description": "The funnel's project id, if you have one from something you were shown. If you do not, use funnel_name instead — do not guess a uuid.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "funnel_name": {
                    "description": "What the member calls the funnel, when you do not have its id. It is matched against their own projects only.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "conversion_event": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "The ONE thing that counts as a conversion for this funnel, in the member's own words — a booked call, a purchase, an application submitted. Their answer verbatim; never a tidied-up version of it and never one you chose."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "conversion_event"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "project_board_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "conversion_event": {
                          "type": "string"
                        },
                        "set_at": {
                          "type": "string"
                        },
                        "previous_conversion_event": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "attributed": {
                          "type": "boolean"
                        },
                        "attribution_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "attributed",
                        "attribution_note",
                        "conversion_event",
                        "previous_conversion_event",
                        "project_board_id",
                        "set_at",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/funnel.execute_part": {
      "post": {
        "operationId": "call_funnel_execute_part",
        "summary": "Call funnel.execute_part",
        "description": "Build ONE part of a funnel the member has already planned and scaffolded — 'build the landing page for the funnel', 'set up the email sequence for the funnel' — the landing page, the email sequence, and so on. Call it FIRST WITHOUT answers: it replies with the questions only the member can decide (the offer's numbers, the page's words, every email's copy) and creates absolutely nothing. Put those questions to them with ask_user — the run waits for their answer — then call it again with their answers, each copied word for word from their reply, and it drafts and configures the part through that part's own tools. An answer that is not in their own words is refused and asked again. A part whose prerequisites have not passed their test is refused, naming what is missing. Not for proving a built part with a test lead — that is `funnel.test_part`. 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.\n\nEvery 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.",
        "tags": [
          "funnel"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "project_board_id": {
                    "description": "The funnel's project id, if you have one from something you were shown. If you do not, use funnel_name instead — do not guess a uuid.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "funnel_name": {
                    "description": "What the member calls the funnel, when you do not have its id. It is matched against their own projects only.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "part": {
                    "type": "string",
                    "enum": [
                      "landing_pages",
                      "email_sequences",
                      "pipeline",
                      "automations",
                      "creative",
                      "tracking",
                      "data_table"
                    ],
                    "description": "Which part of the funnel to build. It must be one the plan covers, and every part it depends on must have PASSED its test first."
                  },
                  "answers": {
                    "description": "The member's answers to this part's leverage points. LEAVE IT OUT on your first call: the tool answers with the questions and creates nothing. Ask them with ask_user, then call again with their answers, each copied from their reply.",
                    "maxItems": 28,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "leverage_point": {
                          "type": "string",
                          "minLength": 1,
                          "description": "The `id` of the leverage point being answered — copy it exactly from the question you were given. The question's own wording is accepted too; anything else is refused rather than guessed at."
                        },
                        "answer": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 4000,
                          "description": "What the MEMBER said, copied word for word from their answer. An answer that is not in their own message is refused and asked again — never your own draft standing in for their decision."
                        }
                      },
                      "required": [
                        "leverage_point",
                        "answer"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "part"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "project_board_id": {
                          "type": "string"
                        },
                        "part": {
                          "type": "string"
                        },
                        "label": {
                          "type": "string"
                        },
                        "phase": {
                          "type": "string",
                          "enum": [
                            "awaiting_answers",
                            "configured",
                            "awaiting_confirmation"
                          ]
                        },
                        "leverage_questions": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "question": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "id",
                              "question"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "next_call": {
                          "type": "object",
                          "properties": {
                            "tool": {
                              "type": "string"
                            },
                            "input": {
                              "type": "object",
                              "propertyNames": {
                                "type": "string"
                              },
                              "additionalProperties": {}
                            }
                          },
                          "required": [
                            "tool",
                            "input"
                          ],
                          "additionalProperties": false
                        },
                        "steps_run": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "description": {
                                "type": "string"
                              },
                              "tool": {
                                "type": "string"
                              },
                              "ok": {
                                "type": "boolean"
                              },
                              "detail": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "description",
                              "tool",
                              "ok",
                              "detail"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "unverified",
                            "passed",
                            "failed"
                          ]
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/funnel.test_part": {
      "post": {
        "operationId": "call_funnel_test_part",
        "summary": "Call funnel.test_part",
        "description": "Prove ONE configured part of a funnel — 'test the landing page', 'check the first email sends' — by running a synthetic test lead through it — a form fill that has to land a lead, a first send that has to reach the test inbox. The lead is always synthetic and every send goes to the workspace's designated test address, never a real person. It writes `passed`, or `failed` naming the exact step, onto the funnel's plan. A part that has not passed is unverified, never done — and the funnel AS A WHOLE stays unverified however many parts pass. Not for the whole funnel end to end — that is `funnel.test_end_to_end`. 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.\n\nEvery 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.",
        "tags": [
          "funnel"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "project_board_id": {
                    "description": "The funnel's project id, if you have one from something you were shown. If you do not, use funnel_name instead — do not guess a uuid.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "funnel_name": {
                    "description": "What the member calls the funnel, when you do not have its id. It is matched against their own projects only.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "part": {
                    "type": "string",
                    "enum": [
                      "landing_pages",
                      "email_sequences",
                      "pipeline",
                      "automations",
                      "creative",
                      "tracking",
                      "data_table"
                    ],
                    "description": "Which part to prove. It has to have been configured first."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "part"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "project_board_id": {
                          "type": "string"
                        },
                        "part": {
                          "type": "string"
                        },
                        "label": {
                          "type": "string"
                        },
                        "outcome": {
                          "type": "string",
                          "enum": [
                            "passed",
                            "failed"
                          ]
                        },
                        "failed_step": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "steps": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "inbox": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "whole": {
                          "type": "string",
                          "enum": [
                            "unverified",
                            "passed",
                            "failed"
                          ]
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/funnel.test_end_to_end": {
      "post": {
        "operationId": "call_funnel_test_end_to_end",
        "summary": "Call funnel.test_end_to_end",
        "description": "Prove the WHOLE funnel — 'test the whole funnel', 'run a lead all the way through' — by running one synthetic lead all the way through it, in order: the form on the landing page, then the lead reaching the pipeline's first stage, then the sequence's first send, then the deal moving a stage on, then the closing event. It only runs once EVERY part has passed its own test, and it refuses by name if any has not. The lead is always synthetic and every send goes to the workspace's designated test address, never a real person. It writes `passed`, or `failed` naming the exact hop, onto the funnel's plan — and if a hop cannot be driven at all it says so and writes NOTHING, because a funnel that was never tested is not a funnel that failed. Not for testing one part on its own — that is `funnel.test_part`. 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.\n\nEvery 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.",
        "tags": [
          "funnel"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "project_board_id": {
                    "description": "The funnel's project id, if you have one from something you were shown. If you do not, use funnel_name instead — do not guess a uuid.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "funnel_name": {
                    "description": "What the member calls the funnel, when you do not have its id. It is matched against their own projects only.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "project_board_id": {
                          "type": "string"
                        },
                        "outcome": {
                          "type": "string",
                          "enum": [
                            "passed",
                            "failed",
                            "refused"
                          ]
                        },
                        "failed_hop": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "refused_hop": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "hops": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "hop": {
                                "type": "string"
                              },
                              "label": {
                                "type": "string"
                              },
                              "state": {
                                "type": "string",
                                "enum": [
                                  "observed",
                                  "not_observed",
                                  "skipped"
                                ]
                              },
                              "detail": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "hop",
                              "label",
                              "state",
                              "detail"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "steps": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "inbox": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "whole": {
                          "type": "string",
                          "enum": [
                            "unverified",
                            "passed",
                            "failed"
                          ]
                        },
                        "whole_failed_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/funnel.turn_on": {
      "post": {
        "operationId": "call_funnel_turn_on",
        "summary": "Call funnel.turn_on",
        "description": "Switch a funnel ON — 'turn the funnel on', 'go live with this funnel' — from that moment its automations run as the member built them. It is allowed only after the end-to-end test lead has PASSED. Call it on the ask: it raises the approval card naming the funnel and exactly which automations start running on their own, which is the member's confirmation, so it can still be declined after you call it. Never say the funnel is on until the card is approved and the call comes back. Review still happens wherever they put an approval step inside a workflow, and nowhere else. Not for switching it off — that is `funnel.turn_off`. 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.\n\nEvery 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.",
        "tags": [
          "funnel"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "project_board_id": {
                    "description": "The funnel's project id, if you have one from something you were shown. If you do not, use funnel_name instead — do not guess a uuid.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "funnel_name": {
                    "description": "What the member calls the funnel, when you do not have its id. It is matched against their own projects only.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "project_board_id": {
                          "type": "string"
                        },
                        "phase": {
                          "type": "string",
                          "const": "turned_on"
                        },
                        "turned_on": {
                          "type": "boolean"
                        },
                        "turned_on_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "automations": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "board_id": {
                                "type": "string"
                              },
                              "name": {
                                "type": "string"
                              },
                              "on": {
                                "type": "boolean"
                              },
                              "changed": {
                                "type": "boolean"
                              },
                              "problem": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "board_id",
                              "name",
                              "on",
                              "changed",
                              "problem"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/funnel.turn_off": {
      "post": {
        "operationId": "call_funnel_turn_off",
        "summary": "Call funnel.turn_off",
        "description": "Switch a funnel OFF — 'turn the funnel off', 'pause this funnel' — its automations stop running until it is switched back on. Nothing is deleted and nothing is lost: every page, sequence and workflow stays exactly as it is, so switching it back on restores what it was running. Not for switching it on — that is `funnel.turn_on`.\n\nEvery 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.",
        "tags": [
          "funnel"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "project_board_id": {
                    "description": "The funnel's project id, if you have one from something you were shown. If you do not, use funnel_name instead — do not guess a uuid.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "funnel_name": {
                    "description": "What the member calls the funnel, when you do not have its id. It is matched against their own projects only.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "project_board_id": {
                          "type": "string"
                        },
                        "turned_on": {
                          "type": "boolean"
                        },
                        "automations": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "board_id": {
                                "type": "string"
                              },
                              "name": {
                                "type": "string"
                              },
                              "on": {
                                "type": "boolean"
                              },
                              "changed": {
                                "type": "boolean"
                              },
                              "problem": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "board_id",
                              "name",
                              "on",
                              "changed",
                              "problem"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "answer_note",
                        "automations",
                        "project_board_id",
                        "turned_on",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/connections.publish_local_post": {
      "post": {
        "operationId": "call_connections_publish_local_post",
        "summary": "Call connections.publish_local_post",
        "description": "Push one local post out to this workspace's Google Business Profile — 'post this update to our Google Business Profile', 'publish a local post about our sale'. Publish one local post to this workspace's Google Business Profile. It is PUBLIC — customers see it on the business's listing — so calling it raises the approval card showing the exact wording, which is the operator's confirmation, and only their approve publishes it. Check `connections.business_profile_status` first and do not offer this when `can_publish` is false. The text goes out exactly as written. Not for whether a local post can go out right now — that is `connections.business_profile_status`. 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.\n\nEvery 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.",
        "tags": [
          "connections"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "piece_id": {
                    "type": "string",
                    "description": "The content piece this post came from. It is what makes the published post reconcilable back to what the operator approved — never invent one, and never reuse another piece's id."
                  },
                  "text": {
                    "type": "string",
                    "description": "The post body, exactly as the operator approved it. On a Business Profile the text IS the post — there is no caption/body split — so do not append hashtags, links or sign-offs the operator did not write."
                  },
                  "media_url": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "One photo or video URL, or null for a text-only post. A Business Profile local post carries at most ONE media item; a second is refused rather than dropped."
                  },
                  "media_type": {
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "image",
                          "video"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "What `media_url` points at. Null when there is no media. Must match the asset — a mislabelled type is refused by Google, not silently corrected."
                  },
                  "media_mime_type": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "The asset's MIME type, e.g. `image/jpeg` or `video/mp4`. Null when there is no media. Read it off the asset — never guess one to satisfy the field."
                  },
                  "idempotency_key": {
                    "type": "string",
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "media_mime_type",
                  "media_type",
                  "media_url",
                  "piece_id",
                  "text"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "external_post_id": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "scheduled",
                            "publishing",
                            "published",
                            "failed",
                            "unknown"
                          ],
                          "description": "Google's OWN state for the post, not our optimism. A fresh post is very often `publishing` — report that as 'Google is still processing it', never as live."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/threads.account": {
      "post": {
        "operationId": "call_threads_account",
        "summary": "Call threads.account",
        "description": "Check the brand's connected Threads profile and its recent posts — 'what's on our Threads account', 'show me our recent Threads posts'. Read the brand's connected Threads profile and its own recent posts. Use it to answer what is on the Threads account, to quote a post the operator is referring to, or to find a post's id before opening its details. Only the connected profile's own posts are visible — never anyone else's. Not for one post's full details — that is `threads.read_post`.\n\nEvery 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.",
        "tags": [
          "threads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "limit": {
                    "description": "How many posts to read back. Clamped by the client.",
                    "type": "integer",
                    "exclusiveMinimum": 0
                  },
                  "after": {
                    "description": "The next_cursor from a previous call, to read the next page.",
                    "type": "string"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "profile": {
                          "type": "object",
                          "properties": {
                            "username": {
                              "type": "string"
                            },
                            "name": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "biography": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "profile_picture_url": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "is_verified": {
                              "type": "boolean"
                            }
                          },
                          "required": [
                            "username",
                            "name",
                            "biography",
                            "profile_picture_url",
                            "is_verified"
                          ],
                          "additionalProperties": false
                        },
                        "posts": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "post_id": {
                                "type": "string"
                              },
                              "media_type": {
                                "type": "string"
                              },
                              "text": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "media_url": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "thumbnail_url": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "permalink": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "posted_at": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "is_quote_post": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "post_id",
                              "media_type",
                              "text",
                              "media_url",
                              "thumbnail_url",
                              "permalink",
                              "posted_at",
                              "is_quote_post"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "next_cursor": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "next_cursor",
                        "posts",
                        "profile",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/threads.read_post": {
      "post": {
        "operationId": "call_threads_read_post",
        "summary": "Call threads.read_post",
        "description": "Pull up one Threads post and read its details — 'what does this Threads post say', 'when was this posted'. Open one Threads post and read its details — the text, the image or video on it, and when it was posted. Call threads.account first: its post_id values are the only valid input, and an invented id will simply not be found. Not for listing the account's recent posts — that is `threads.account`.\n\nEvery 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.",
        "tags": [
          "threads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "post_id": {
                    "type": "string",
                    "minLength": 1,
                    "description": "A post_id from threads.account — the only place valid ids come from."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "post_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "post_id": {
                          "type": "string"
                        },
                        "media_type": {
                          "type": "string"
                        },
                        "text": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "media_url": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "thumbnail_url": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "permalink": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "posted_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "is_quote_post": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "is_quote_post",
                        "media_type",
                        "media_url",
                        "permalink",
                        "post_id",
                        "posted_at",
                        "text",
                        "thumbnail_url",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.create_conversion_action": {
      "post": {
        "operationId": "call_ads_create_conversion_action",
        "summary": "Call ads.create_conversion_action",
        "description": "Create the measurement a Google Ads campaign optimises toward — 'set up a conversion action', 'add a conversion goal for Performance Max'. Create a Google Ads conversion action for this brand — the measurement a campaign optimises toward — and report what Google read back afterwards. It spends nothing: it creates no budget and attaches to no campaign. A Performance Max campaign needs one before it can bid. Reuse the same idempotency_key on a retry so a retry cannot create a second one. Not for choosing which Google Analytics conversions the brand reports — that is `connections.set_conversion_events`. 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.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "description": "What this conversion is called."
                  },
                  "shape": {
                    "type": "string",
                    "enum": [
                      "website",
                      "website_call",
                      "ad_call"
                    ],
                    "description": "What is being measured: a website action, a call from the website, or a call placed straight from the ad."
                  },
                  "category": {
                    "description": "Google's conversion category, when the operator names one.",
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "phone_call_duration_seconds": {
                    "description": "How long a call must last to count. REQUIRED on website_call and ad_call — without it every dialled-and-hung-up call is recorded as a lead. Google rejects it on a website conversion.",
                    "anyOf": [
                      {
                        "type": "integer"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "default_value_usd_cents": {
                    "description": "What one conversion is worth, in cents.",
                    "anyOf": [
                      {
                        "type": "integer",
                        "minimum": 0
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "primary_for_goal": {
                    "description": "Whether this counts toward the account's main conversions goal, which is what makes it usable as a bidding target.",
                    "type": "boolean"
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "name",
                  "shape"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "resource_name": {
                          "type": "string"
                        },
                        "id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "type": {
                          "type": "string"
                        },
                        "category": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string"
                        },
                        "primary_for_goal": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.create_smart_campaign": {
      "post": {
        "operationId": "call_ads_create_smart_campaign",
        "summary": "Call ads.create_smart_campaign",
        "description": "Prepare a Google Ads Smart campaign — 'set up a smart campaign', 'create a google smart campaign'. Create a Google Ads SMART campaign for this brand from its saved settings. Call it on the ask: it raises the approval card, which is the operator's confirmation, and nothing is created unless they approve it there. ⚠️ It is then created PAUSED and stays paused — you cannot start it, and nothing here spends the budget. Say so when you report it, and tell the operator that starting it is their decision. The business details and ad copy come from the brand's saved settings, not from you: if they are missing the create is refused naming every field, and `ads.google_settings` is where they are filled in. Reuse the same idempotency_key on a retry — a fresh key mints a second campaign. Not for a Performance Max campaign — that is `ads.create_pmax_campaign`. 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.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "description": "What the campaign is called."
                  },
                  "daily_budget_usd_cents": {
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "description": "The DAILY budget, in cents. 5000 is fifty dollars a day."
                  },
                  "start_at": {
                    "description": "ISO-8601, optional.",
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "end_at": {
                    "description": "ISO-8601, optional.",
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "daily_budget_usd_cents",
                  "name"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "resource_name": {
                          "type": "string"
                        },
                        "id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string"
                        },
                        "channel_type": {
                          "type": "string"
                        },
                        "channel_sub_type": {
                          "type": "string"
                        },
                        "setting_populated": {
                          "type": "boolean"
                        },
                        "applied_readback": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ads.create_pmax_campaign": {
      "post": {
        "operationId": "call_ads_create_pmax_campaign",
        "summary": "Call ads.create_pmax_campaign",
        "description": "Prepare a Google Ads Performance Max campaign — 'set up a performance max campaign', 'create a pmax campaign from our brand'. Create a Google Ads PERFORMANCE MAX campaign for this brand, with the asset group built from its saved words and pictures, and report the asset counts Google read back. Call it on the ask: it raises the approval card, which is the operator's confirmation, and nothing is created unless they approve it there. ⚠️ It is then created PAUSED and stays paused — you cannot start it, and nothing here spends the budget. Say so when you report it. Two saved things decide whether it can run at all: a bidding choice Performance Max accepts, and the Performance Max assets — `ads.google_settings` reports exactly which are missing. If missing_required_field_types comes back non-empty, say so: the campaign exists but the group cannot serve yet. Reuse the same idempotency_key on a retry — a fresh key mints a second campaign. Not for a Smart campaign — that is `ads.create_smart_campaign`. 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.\n\nEvery 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.",
        "tags": [
          "ads"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Your key for this write: send the same key when you retry and the first result comes back instead of a second action. Keys are honoured for at least 24 hours. 1–200 visible ASCII characters. Replaces the `idempotency_key` body field, which still works until 2026-12-31; this action needs a key on one of the two, and the header is the one to send.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "description": "What the campaign is called."
                  },
                  "daily_budget_usd_cents": {
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "description": "The DAILY budget, in cents. 5000 is fifty dollars a day."
                  },
                  "start_at": {
                    "description": "ISO-8601, optional.",
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "end_at": {
                    "description": "ISO-8601, optional.",
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "idempotency_key": {
                    "type": "string",
                    "minLength": 1,
                    "description": "Deprecated on REST: send the `Idempotency-Key` header instead. Still accepted until 2026-12-31; if both are sent they must match."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "daily_budget_usd_cents",
                  "name"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "resource_name": {
                          "type": "string"
                        },
                        "id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string"
                        },
                        "channel_type": {
                          "type": "string"
                        },
                        "asset_group_resource_name": {
                          "type": "string"
                        },
                        "asset_group_status": {
                          "type": "string"
                        },
                        "asset_counts_by_field_type": {
                          "type": "object",
                          "propertyNames": {
                            "type": "string"
                          },
                          "additionalProperties": {
                            "type": "number"
                          }
                        },
                        "missing_required_field_types": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "applied_readback": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/documents.generate_spreadsheet": {
      "post": {
        "operationId": "call_documents_generate_spreadsheet",
        "summary": "Call documents.generate_spreadsheet",
        "description": "Make a spreadsheet — 'put this in a spreadsheet', 'give me an Excel file of that', 'export these as a CSV I can open'.  Create a spreadsheet — an .xlsx workbook or a single-sheet CSV — from data you already have, and save it to this workspace's library. Declare the columns, then give the rows as objects keyed by those columns. On success: tell the operator the file is saved to their library, name it, and give them the download link — say the link is temporary while the file itself stays in the library. Never paste the file's contents back into the conversation. If the result carries `warnings`, the file WAS made but something in it needs saying — read each warning out before you offer the link, and offer to fix what it names. Not for a Data table that lives on a board — that is `data.create_table`.\n\nEvery 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.",
        "tags": [
          "documents"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "description": "The artifact's BASE name, with no file extension — the engine appends the one that matches what it actually wrote."
                  },
                  "format": {
                    "type": "string",
                    "enum": [
                      "xlsx",
                      "csv"
                    ],
                    "description": "`xlsx` for a real workbook (multiple tabs, column widths). `csv` for plain data — CSV is a SINGLE-SHEET format, so a csv request carrying more than one sheet is refused rather than silently truncated."
                  },
                  "sheets": {
                    "minItems": 1,
                    "maxItems": 12,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "minLength": 1,
                          "description": "The tab name."
                        },
                        "columns": {
                          "minItems": 1,
                          "maxItems": 64,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string",
                                "minLength": 1,
                                "description": "The key each row object uses for this column."
                              },
                              "header": {
                                "type": "string",
                                "description": "The header text written in row 1."
                              },
                              "width": {
                                "description": "Optional column width in Excel character units. Ignored by CSV.",
                                "type": "integer",
                                "exclusiveMinimum": 0
                              }
                            },
                            "required": [
                              "key",
                              "header"
                            ],
                            "additionalProperties": false
                          },
                          "description": "The columns, in the order they should appear."
                        },
                        "rows": {
                          "maxItems": 5000,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "propertyNames": {
                              "type": "string"
                            },
                            "additionalProperties": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "number"
                                },
                                {
                                  "type": "boolean"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "description": "The data rows, each an object keyed by column key. Values are text, numbers, true/false or null — a DATE is passed as the text you want the reader to see, because a date's format and timezone differ between xlsx and CSV and guessing either would change what the sheet says."
                        }
                      },
                      "required": [
                        "name",
                        "columns",
                        "rows"
                      ],
                      "additionalProperties": false
                    },
                    "description": "One entry per tab. Declare the columns first, then give each row as an object keyed by those column keys — a row key with no matching column is REFUSED, never dropped, so the export can never be quietly incomplete."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "name",
                  "format",
                  "sheets"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "storage_object_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "filename": {
                          "type": "string"
                        },
                        "content_type": {
                          "type": "string"
                        },
                        "byte_length": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "render_path": {
                          "type": "string"
                        },
                        "download_url": {
                          "type": "string"
                        },
                        "warnings": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "code": {
                                "type": "string"
                              },
                              "message": {
                                "type": "string"
                              },
                              "context": {
                                "type": "object",
                                "propertyNames": {
                                  "type": "string"
                                },
                                "additionalProperties": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "number"
                                    },
                                    {
                                      "type": "boolean"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              }
                            },
                            "required": [
                              "code",
                              "message"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "byte_length",
                        "content_type",
                        "download_url",
                        "filename",
                        "render_path",
                        "storage_object_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/documents.generate_document": {
      "post": {
        "operationId": "call_documents_generate_document",
        "summary": "Call documents.generate_document",
        "description": "Make a Word document — 'write this up as a doc', 'put it in a Word file', 'I need this as a document I can send'.  Create a Word document (.docx) from an ordered list of headings, paragraphs and bullet lists, and save it to this workspace's library. On success: tell the operator the file is saved to their library, name it, and give them the download link — say the link is temporary while the file itself stays in the library. Never paste the file's contents back into the conversation. If the result carries `warnings`, the file WAS made but something in it needs saying — read each warning out before you offer the link, and offer to fix what it names. Not for a PDF report — that is `documents.generate_pdf`.\n\nEvery 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.",
        "tags": [
          "documents"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "description": "The artifact's BASE name, with no file extension — the engine appends the one that matches what it actually wrote."
                  },
                  "title": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The document's title, written as its first heading."
                  },
                  "blocks": {
                    "minItems": 1,
                    "maxItems": 500,
                    "type": "array",
                    "items": {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "kind": {
                              "type": "string",
                              "const": "heading"
                            },
                            "level": {
                              "anyOf": [
                                {
                                  "type": "number",
                                  "const": 1
                                },
                                {
                                  "type": "number",
                                  "const": 2
                                },
                                {
                                  "type": "number",
                                  "const": 3
                                }
                              ],
                              "description": "Headings only: 1, 2 or 3."
                            },
                            "text": {
                              "type": "string",
                              "description": "Headings and paragraphs: the text."
                            }
                          },
                          "required": [
                            "kind",
                            "level",
                            "text"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "kind": {
                              "type": "string",
                              "const": "paragraph"
                            },
                            "text": {
                              "type": "string",
                              "description": "Headings and paragraphs: the text."
                            }
                          },
                          "required": [
                            "kind",
                            "text"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "object",
                          "properties": {
                            "kind": {
                              "type": "string",
                              "const": "bullets"
                            },
                            "items": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              },
                              "description": "Bullets only: one string per bullet."
                            }
                          },
                          "required": [
                            "kind",
                            "items"
                          ],
                          "additionalProperties": false
                        }
                      ]
                    },
                    "description": "The body, in order. Each block is a heading (level 1-3), a paragraph, or a bullet list. There is no rich-text markup — write plain sentences and let the block kinds carry the structure."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "name",
                  "title",
                  "blocks"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "storage_object_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "filename": {
                          "type": "string"
                        },
                        "content_type": {
                          "type": "string"
                        },
                        "byte_length": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "render_path": {
                          "type": "string"
                        },
                        "download_url": {
                          "type": "string"
                        },
                        "warnings": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "code": {
                                "type": "string"
                              },
                              "message": {
                                "type": "string"
                              },
                              "context": {
                                "type": "object",
                                "propertyNames": {
                                  "type": "string"
                                },
                                "additionalProperties": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "number"
                                    },
                                    {
                                      "type": "boolean"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              }
                            },
                            "required": [
                              "code",
                              "message"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "byte_length",
                        "content_type",
                        "download_url",
                        "filename",
                        "render_path",
                        "storage_object_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/documents.generate_deck": {
      "post": {
        "operationId": "call_documents_generate_deck",
        "summary": "Call documents.generate_deck",
        "description": "Make a slide deck — 'put this into a deck', 'make me slides for the pitch', 'turn this into a presentation'.  Create a slide deck (.pptx) from a title and a list of slides, and save it to this workspace's library. Bullets go on the slide; full sentences go in the speaker notes. On success: tell the operator the file is saved to their library, name it, and give them the download link — say the link is temporary while the file itself stays in the library. Never paste the file's contents back into the conversation. If the result carries `warnings`, the file WAS made but something in it needs saying — read each warning out before you offer the link, and offer to fix what it names. Not for a written document — that is `documents.generate_document`.\n\nEvery 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.",
        "tags": [
          "documents"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "description": "The artifact's BASE name, with no file extension — the engine appends the one that matches what it actually wrote."
                  },
                  "title": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The deck's title. It COMPOSES THE OPENING SLIDE — slide 1 is built from it, so do not also write a title slide as the first entry in `slides` or the deck opens on the same words twice."
                  },
                  "slides": {
                    "minItems": 1,
                    "maxItems": 100,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "title": {
                          "type": "string"
                        },
                        "bullets": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "notes": {
                          "description": "Optional speaker notes. Omit it entirely when there are none.",
                          "type": "string"
                        }
                      },
                      "required": [
                        "title",
                        "bullets"
                      ],
                      "additionalProperties": false
                    },
                    "description": "The slides, in order. Each is a title plus bullets — keep bullets short; a slide is not a paragraph. Put the sentences you would say out loud in `notes` instead."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "name",
                  "title",
                  "slides"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "storage_object_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "filename": {
                          "type": "string"
                        },
                        "content_type": {
                          "type": "string"
                        },
                        "byte_length": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "render_path": {
                          "type": "string"
                        },
                        "download_url": {
                          "type": "string"
                        },
                        "warnings": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "code": {
                                "type": "string"
                              },
                              "message": {
                                "type": "string"
                              },
                              "context": {
                                "type": "object",
                                "propertyNames": {
                                  "type": "string"
                                },
                                "additionalProperties": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "number"
                                    },
                                    {
                                      "type": "boolean"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              }
                            },
                            "required": [
                              "code",
                              "message"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "byte_length",
                        "content_type",
                        "download_url",
                        "filename",
                        "render_path",
                        "storage_object_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/documents.generate_pdf": {
      "post": {
        "operationId": "call_documents_generate_pdf",
        "summary": "Call documents.generate_pdf",
        "description": "Make a PDF report — 'send me this as a PDF', 'turn this into a report', 'I need a PDF of these numbers'.  Create a PDF by printing HTML you write, and save it to this workspace's library. Send the document BODY only — scripts and remote files are refused by the renderer, so the markup must stand on its own. To include a chart, declare it in `charts` and write its `{{chart:…}}` token in the body: that is the only way a figure gets into a report. On success: tell the operator the file is saved to their library, name it, and give them the download link — say the link is temporary while the file itself stays in the library. Never paste the file's contents back into the conversation. If the result carries `warnings`, the file WAS made but something in it needs saying — read each warning out before you offer the link, and offer to fix what it names. Not for an editable Word document — that is `documents.generate_document`.\n\nEvery 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.",
        "tags": [
          "documents"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "description": "The artifact's BASE name, with no file extension — the engine appends the one that matches what it actually wrote."
                  },
                  "html": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000000,
                    "description": "The document BODY as HTML — headings, paragraphs, lists, tables, inline `style` attributes. Do NOT send a whole page: no <html>, <head>, <script>, <link> or <img src=\"http…\">. The renderer wraps your markup in a document whose content policy refuses every script and every remote file, so any of those is silently inert rather than an error. To place a chart, write the token `{{chart:sales}}` where it belongs and declare a matching entry in `charts`."
                  },
                  "charts": {
                    "description": "Charts to compose INTO this report. This is the only way to put a chart in a PDF: a chart made with `documents.generate_chart` is a separate file and cannot be pulled into a document, because the renderer refuses every remote file. Give each entry a `placeholder` and write `{{chart:<placeholder>}}` in the body where the chart belongs — a declared chart the body never writes, and a token no chart declares, are both REFUSED rather than quietly dropped.",
                    "maxItems": 12,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "placeholder": {
                          "type": "string",
                          "pattern": "^[A-Za-z0-9_-]{1,64}$",
                          "description": "The name used in the body's `{{chart:…}}` token."
                        },
                        "chartType": {
                          "type": "string",
                          "enum": [
                            "bar",
                            "line",
                            "pie"
                          ]
                        },
                        "title": {
                          "description": "Optional chart title.",
                          "type": "string"
                        },
                        "categories": {
                          "minItems": 1,
                          "maxItems": 500,
                          "type": "array",
                          "items": {
                            "type": "string"
                          },
                          "description": "The x-axis labels (or the pie's slice labels). Every series must carry exactly one value per category."
                        },
                        "series": {
                          "minItems": 1,
                          "maxItems": 12,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string"
                              },
                              "values": {
                                "type": "array",
                                "items": {
                                  "type": "number"
                                }
                              }
                            },
                            "required": [
                              "name",
                              "values"
                            ],
                            "additionalProperties": false
                          },
                          "description": "One entry per plotted line/bar-group. A PIE chart takes exactly one series."
                        },
                        "width": {
                          "description": "Optional pixel width.",
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "height": {
                          "description": "Optional pixel height.",
                          "type": "integer",
                          "exclusiveMinimum": 0
                        }
                      },
                      "required": [
                        "placeholder",
                        "chartType",
                        "categories",
                        "series"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "pageSize": {
                    "description": "Defaults to a4.",
                    "type": "string",
                    "enum": [
                      "a4",
                      "letter"
                    ]
                  },
                  "orientation": {
                    "description": "Defaults to portrait.",
                    "type": "string",
                    "enum": [
                      "portrait",
                      "landscape"
                    ]
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "name",
                  "html"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "storage_object_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "filename": {
                          "type": "string"
                        },
                        "content_type": {
                          "type": "string"
                        },
                        "byte_length": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "render_path": {
                          "type": "string"
                        },
                        "download_url": {
                          "type": "string"
                        },
                        "warnings": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "code": {
                                "type": "string"
                              },
                              "message": {
                                "type": "string"
                              },
                              "context": {
                                "type": "object",
                                "propertyNames": {
                                  "type": "string"
                                },
                                "additionalProperties": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "number"
                                    },
                                    {
                                      "type": "boolean"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              }
                            },
                            "required": [
                              "code",
                              "message"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "byte_length",
                        "content_type",
                        "download_url",
                        "filename",
                        "render_path",
                        "storage_object_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/documents.generate_chart": {
      "post": {
        "operationId": "call_documents_generate_chart",
        "summary": "Call documents.generate_chart",
        "description": "Turn numbers into a chart the member can use — 'make me a chart of that', 'graph those numbers', 'show this as a bar chart'.  Create a bar, line or pie chart from category labels and one or more data series, and save it to this workspace's library as an SVG. This makes a STANDALONE chart file — a chart that belongs inside a PDF report is declared on `documents.generate_pdf`'s `charts` instead, because a saved chart file cannot be pulled into a document. On success: tell the operator the file is saved to their library, name it, and give them the download link — say the link is temporary while the file itself stays in the library. Never paste the file's contents back into the conversation. If the result carries `warnings`, the file WAS made but something in it needs saying — read each warning out before you offer the link, and offer to fix what it names. Not for a chart inside a PDF report — that is `documents.generate_pdf`.\n\nEvery 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.",
        "tags": [
          "documents"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "description": "The artifact's BASE name, with no file extension — the engine appends the one that matches what it actually wrote."
                  },
                  "format": {
                    "type": "string",
                    "enum": [
                      "svg"
                    ],
                    "description": "`svg` — a crisp vector chart. It is the only format available; a raster export is not wired yet."
                  },
                  "chartType": {
                    "type": "string",
                    "enum": [
                      "bar",
                      "line",
                      "pie"
                    ]
                  },
                  "title": {
                    "description": "Optional chart title.",
                    "type": "string"
                  },
                  "categories": {
                    "minItems": 1,
                    "maxItems": 500,
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "The x-axis labels (or the pie's slice labels). Every series must carry exactly one value per category."
                  },
                  "series": {
                    "minItems": 1,
                    "maxItems": 12,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "values": {
                          "type": "array",
                          "items": {
                            "type": "number"
                          }
                        }
                      },
                      "required": [
                        "name",
                        "values"
                      ],
                      "additionalProperties": false
                    },
                    "description": "One entry per plotted line/bar-group. A PIE chart takes exactly one series."
                  },
                  "width": {
                    "description": "Optional pixel width.",
                    "type": "integer",
                    "exclusiveMinimum": 0
                  },
                  "height": {
                    "description": "Optional pixel height.",
                    "type": "integer",
                    "exclusiveMinimum": 0
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "name",
                  "format",
                  "chartType",
                  "categories",
                  "series"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "storage_object_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "filename": {
                          "type": "string"
                        },
                        "content_type": {
                          "type": "string"
                        },
                        "byte_length": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "render_path": {
                          "type": "string"
                        },
                        "download_url": {
                          "type": "string"
                        },
                        "warnings": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "code": {
                                "type": "string"
                              },
                              "message": {
                                "type": "string"
                              },
                              "context": {
                                "type": "object",
                                "propertyNames": {
                                  "type": "string"
                                },
                                "additionalProperties": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "number"
                                    },
                                    {
                                      "type": "boolean"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              }
                            },
                            "required": [
                              "code",
                              "message"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "byte_length",
                        "content_type",
                        "download_url",
                        "filename",
                        "render_path",
                        "storage_object_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/email_sequence.create": {
      "post": {
        "operationId": "call_email_sequence_create",
        "summary": "Call email_sequence.create",
        "description": "Start a new email sequence — 'set up a welcome sequence', 'I need a five-email nurture', 'start a follow-up sequence for new leads'.  Create an email sequence board and open it with empty email blocks. The blocks are real, editable emails from the moment it returns; nothing is written into them and nothing is sent. Not for a one-off campaign email — that is `email_campaign.draft`.\n\nEvery 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.",
        "tags": [
          "email_sequence"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "sequence_type_id": {
                    "description": "Which starter sequence to open. It decides how many empty email blocks the board starts with — 'newsletter' is the one-block broadcast. Leave it out for a blank single-block sequence.",
                    "type": "string",
                    "enum": [
                      "welcome",
                      "launch",
                      "nurture",
                      "newsletter"
                    ]
                  },
                  "name": {
                    "description": "What to call the sequence. Leave it out to take the starter type's own label.",
                    "type": "string",
                    "maxLength": 120
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "block_count": {
                          "type": "number"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "block_count",
                        "board_id",
                        "name",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/email_sequence.reorder_block": {
      "post": {
        "operationId": "call_email_sequence_reorder_block",
        "summary": "Call email_sequence.reorder_block",
        "description": "Move one email up or down in its sequence — 'move that email earlier', 'swap the last two', 'put this one before the others'.  Move one email block one step up or down in its sequence. If the block is already at that end nothing moves and `moved` is false — that is a success, not a failure. Not for changing an email's words — that is `email_block.save`.\n\nEvery 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.",
        "tags": [
          "email_sequence"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The sequence board the block belongs to."
                  },
                  "membership_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The block's board-item id — the id the sequence listing shows for the block, NOT the email id."
                  },
                  "direction": {
                    "type": "string",
                    "enum": [
                      "up",
                      "down"
                    ],
                    "description": "Which way to move the block, one step."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "board_id",
                  "membership_id",
                  "direction"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "moved": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "moved",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/email_block.save": {
      "post": {
        "operationId": "call_email_block_save",
        "summary": "Call email_block.save",
        "description": "Write one email's subject line, preview text or body — 'change the subject on email two', 'rewrite the second email', 'make the first one shorter'.  Write the subject, preheader, or body of one email block. Only the fields you pass are changed. A block that has been marked final is refused — reopen it first. Nothing is sent. Not for moving an email within the sequence — that is `email_sequence.reorder_block`.\n\nEvery 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.",
        "tags": [
          "email_block"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The email block to write."
                  },
                  "subject": {
                    "description": "The subject line, as it will read in the inbox.",
                    "type": "string",
                    "maxLength": 200
                  },
                  "preview_text": {
                    "description": "The preheader — the line shown after the subject.",
                    "type": "string",
                    "maxLength": 200
                  },
                  "body_markdown": {
                    "description": "The email body as markdown. Omit it to leave the existing body untouched — an empty string CLEARS it.",
                    "type": "string",
                    "maxLength": 20000
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "email_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "saved": {
                          "type": "boolean",
                          "const": true
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "saved",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/email_template.create": {
      "post": {
        "operationId": "call_email_template_create",
        "summary": "Call email_template.create",
        "description": "Start a new email template from one of the starters — 'make me a newsletter template', 'set up an email template', 'start from the promo template'.  Create an email template from one of the starter templates. Use a starter key the templates surface offered — never invent one; the server refuses anything it does not recognise. Not for a new sequence of emails — that is `email_sequence.create`.\n\nEvery 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.",
        "tags": [
          "email_template"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "description": "What to call the template in the templates list."
                  },
                  "starter_key": {
                    "type": "string",
                    "minLength": 1,
                    "description": "Which starter template to build from. Use a key the templates surface offered — the server refuses anything else rather than guessing."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "name",
                  "starter_key"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "template_id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "kind": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "kind",
                        "name",
                        "template_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/email_seed.record_export": {
      "post": {
        "operationId": "call_email_seed_record_export",
        "summary": "Call email_seed.record_export",
        "description": "Note that the member copied a finished sequence out by hand — 'I've copied these out myself', 'mark this one done, I've exported it', 'I moved them over manually'.  Record that the operator copied a finished sequence out by hand. It makes no external call and sends nothing — it just closes the sequence out so the board shows it as finished. Not for handing it to the connected marketing tool — that is `email_seed.push`.\n\nEvery 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.",
        "tags": [
          "email_seed"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The finished sequence the operator copied out."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "board_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "recorded": {
                          "type": "boolean",
                          "const": true
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "recorded",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/email_seed.push": {
      "post": {
        "operationId": "call_email_seed_push",
        "summary": "Call email_seed.push",
        "description": "Hand a finished sequence over to the member's connected marketing tool to send — 'push this into my CRM', 'send it over to my email tool', 'load this sequence into GHL'.  Hand a finished sequence to the customer's connected marketing tool, which then owns the sending. This writes into an outside system, so calling it raises the approval card, which is the operator's confirmation; call it on the ask, and it hands the sequence over only once they approve. It does not send email itself. Not for recording that they copied it out by hand — that is `email_seed.record_export`. 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.\n\nEvery 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.",
        "tags": [
          "email_seed"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "board_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The finished sequence to hand off."
                  },
                  "mode_key": {
                    "type": "string",
                    "minLength": 1,
                    "description": "Which hand-off ending the operator chose. Use a key the seed sheet offered — the server resolves it against its own catalogue and refuses anything else."
                  },
                  "audience_key": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "The connected tool's audience/list key, or null when the chosen ending needs none. It is re-read from the provider, never trusted."
                  },
                  "start_date": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "The first send date as YYYY-MM-DD, or null when the ending needs none."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "board_id",
                  "mode_key",
                  "audience_key",
                  "start_date"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "mode_key": {
                          "type": "string"
                        },
                        "seeded_count": {
                          "type": "number"
                        },
                        "failed": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "subject": {
                                "type": "string"
                              },
                              "reason": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "subject",
                              "reason"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/approvals.list_queue": {
      "post": {
        "operationId": "call_approvals_list_queue",
        "summary": "Call approvals.list_queue",
        "description": "List the work waiting on a human right now — 'what's waiting on me?', 'what needs approving?', 'is anything on my desk?' — rendered and in-review assets, what each one belongs to, and whose desk it is parked on ('you' or 'client'). It is the first read on a daily or weekly check-in, since what waits on them comes before anything else. Each row also carries its videoUnitId and contentBlockId, which is where approvals.request_review's subjectId comes from. Read-only. You can read what is waiting, get an item ready, and ASK a person to decide. You can never approve, reject, or decide anything yourself — say who it is waiting on and stop there. Not for one waiting item in full — that is `approvals.get_item`.\n\nEvery 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.",
        "tags": [
          "approvals"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "assetType": {
                    "description": "Optional: narrow to one kind of asset (for example 'video' or 'thumbnail'). Leave it out to see everything waiting.",
                    "anyOf": [
                      {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 64
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "limit": {
                    "description": "How many waiting assets to return, most urgent first. Default 8, maximum 100.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 100
                  },
                  "cursor": {
                    "description": "Where to continue: pass the `next_cursor` from the previous page, with the same filters. Omit it for the first page.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 512
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "items": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "assetId": {
                                "type": "string"
                              },
                              "assetType": {
                                "type": "string"
                              },
                              "status": {
                                "type": "string"
                              },
                              "videoUnitTitle": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "videoUnitId": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "contentBlockId": {
                                "type": "string"
                              },
                              "isPrimary": {
                                "type": "boolean"
                              },
                              "waitingOn": {
                                "type": "string"
                              },
                              "updatedAt": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "assetId",
                              "assetType",
                              "status",
                              "videoUnitTitle",
                              "videoUnitId",
                              "contentBlockId",
                              "isPrimary",
                              "waitingOn",
                              "updatedAt"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "count": {
                          "type": "number"
                        },
                        "next_cursor": {
                          "description": "Present when there is another page: pass it back as `cursor` to read it. Absent on the last page.",
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "count",
                        "items",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/approvals.set_primary_variant": {
      "post": {
        "operationId": "call_approvals_set_primary_variant",
        "summary": "Call approvals.set_primary_variant",
        "description": "Pick which version of something goes forward — 'use that thumbnail', 'this is the one I want', 'make that the main version'.  Choose which variant of an asset (typically a thumbnail) is the one that goes forward for review. This is CURATION BEFORE approval — it does not approve anything and does not release anything; a person still decides. You can read what is waiting, get an item ready, and ASK a person to decide. You can never approve, reject, or decide anything yourself — say who it is waiting on and stop there. Not for asking someone to approve it — that is `approvals.request_review`.\n\nEvery 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.",
        "tags": [
          "approvals"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "childAssetId": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The variant to make the primary one — an assetId from approvals.list_queue, never invented."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "childAssetId"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "assetId": {
                          "type": "string"
                        },
                        "isPrimary": {
                          "type": "boolean"
                        },
                        "status": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "assetId",
                        "isPrimary",
                        "status",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/approvals.request_rerender": {
      "post": {
        "operationId": "call_approvals_request_rerender",
        "summary": "Call approvals.request_rerender",
        "description": "Send a rejected asset back to be made again — 'have another go at that one', 'redo the one I rejected', 'try that thumbnail again'.  Send a REJECTED asset back to be made again with the same brief. It moves the asset back into the queue — it does not overturn the rejection and it does not approve the new one. You can read what is waiting, get an item ready, and ASK a person to decide. You can never approve, reject, or decide anything yourself — say who it is waiting on and stop there. Not for choosing between variants that already exist — that is `approvals.set_primary_variant`.\n\nEvery 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.",
        "tags": [
          "approvals"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "assetId": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The rejected asset to send back for another go — an assetId from approvals.list_queue, never invented."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "assetId"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "assetId": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "assetId",
                        "status",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/approvals.list_spend": {
      "post": {
        "operationId": "call_approvals_list_spend",
        "summary": "Call approvals.list_spend",
        "description": "Say where the money approvals stand — 'what spend is waiting on approval?', 'has that budget been signed off?', 'what have we approved to spend?'.  List the spend approvals for this brand — what was requested, how much it is, and where the admin and client decisions stand. Read-only: this is how you report on money, never how you release it. You can read what is waiting, get an item ready, and ASK a person to decide. You can never approve, reject, or decide anything yourself — say who it is waiting on and stop there. Not for where the account's credits went — that is `billing.usage_summary`.\n\nEvery 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.",
        "tags": [
          "approvals"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "items": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "provider": {
                                "type": "string"
                              },
                              "destination": {
                                "type": "string"
                              },
                              "mutationKind": {
                                "type": "string"
                              },
                              "amountUsdCents": {
                                "anyOf": [
                                  {
                                    "type": "number"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "adminStatus": {
                                "type": "string"
                              },
                              "clientStatus": {
                                "type": "string"
                              },
                              "state": {
                                "type": "string",
                                "enum": [
                                  "awaiting_decision",
                                  "approved",
                                  "rejected",
                                  "not_required"
                                ],
                                "description": "Where the request actually stands under this brand's approval settings: awaiting_decision (a required approver has not decided), approved (every required approver approved), rejected (a required approver declined; it can never go ahead), or not_required (this brand requires no approval)."
                              },
                              "waitingOn": {
                                "type": "array",
                                "items": {
                                  "type": "string",
                                  "enum": [
                                    "admin",
                                    "client"
                                  ]
                                },
                                "description": "The required approvers who still have to decide; empty once nothing is waiting."
                              },
                              "createdAt": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "id",
                              "provider",
                              "destination",
                              "mutationKind",
                              "amountUsdCents",
                              "adminStatus",
                              "clientStatus",
                              "state",
                              "waitingOn",
                              "createdAt"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "count": {
                          "type": "number"
                        },
                        "requirements": {
                          "type": "object",
                          "properties": {
                            "requireAdminApproval": {
                              "type": "boolean"
                            },
                            "requireClientApproval": {
                              "type": "boolean"
                            }
                          },
                          "required": [
                            "requireAdminApproval",
                            "requireClientApproval"
                          ],
                          "description": "Which approvals this brand requires before a spend goes ahead. A status for an approver that is not required is not a decision anyone is waiting on.",
                          "additionalProperties": false
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "count",
                        "items",
                        "requirements",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/billing.budget_status": {
      "post": {
        "operationId": "call_billing_budget_status",
        "summary": "Call billing.budget_status",
        "description": "Read the account's own monthly budget and how much of it is spent, and every other spend cap's burn — 'how much of our budget have we used?', 'what's our monthly budget?', 'do we pause at the budget?', 'how close are we to our spend cap?'. `payer_budget` is the budget the account set for itself, in credits: this month's spend against it, whether reaching it emails the owners and admins (`notify`) or pauses work that needs credits (`pause`), and the percentages they are emailed at. Say the figures back exactly as given. If `payer_budget.unavailable` is true, say the budget could not be read; never report that as 'no budget', and never report an unavailable cap list as 'no limits'. The other caps are read-only here. Not for changing the budget — that is `billing.budget_set`; not for the credit balance — that is `billing.plan_status`.",
        "tags": [
          "billing"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {},
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` whenever the call did not succeed, including when the tool itself returned a typed `ok: false` — this tool runs at account level, so there is no workspace boundary to distinguish. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "payer_budget": {
                          "type": "object",
                          "properties": {
                            "set": {
                              "type": "boolean"
                            },
                            "budget_credits": {
                              "anyOf": [
                                {
                                  "type": "number"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "spent_credits": {
                              "anyOf": [
                                {
                                  "type": "number"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "percent_used": {
                              "anyOf": [
                                {
                                  "type": "number"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "at_budget": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "notify",
                                    "pause"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "alert_percents": {
                              "type": "array",
                              "items": {
                                "type": "number"
                              }
                            },
                            "can_edit": {
                              "type": "boolean"
                            },
                            "unavailable": {
                              "type": "boolean"
                            }
                          },
                          "required": [
                            "set",
                            "budget_credits",
                            "spent_credits",
                            "percent_used",
                            "at_budget",
                            "alert_percents",
                            "can_edit",
                            "unavailable"
                          ],
                          "additionalProperties": false
                        },
                        "rows": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string"
                              },
                              "label": {
                                "type": "string"
                              },
                              "unit": {
                                "type": "string"
                              },
                              "window": {
                                "type": "string"
                              },
                              "limit_value": {
                                "type": "number"
                              },
                              "consumed": {
                                "type": "number"
                              },
                              "percent_used": {
                                "type": "number"
                              },
                              "enforcement": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "key",
                              "label",
                              "unit",
                              "window",
                              "limit_value",
                              "consumed",
                              "percent_used",
                              "enforcement"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "unavailable": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "ok",
                        "payer_budget",
                        "rows",
                        "unavailable"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/billing.plan_status": {
      "post": {
        "operationId": "call_billing_plan_status",
        "summary": "Call billing.plan_status",
        "description": "Say what plan the account is on and what is left — 'what plan am I on?', 'how many credits do I have left?', 'when does my next bill go out?'.  Read what plan this account is on, how many credits it has left, and its recent charges. Say the figures back exactly as given — never work one out or recall one. Every timestamp is ISO-8601 UTC: convert it into the `display_time_zone` this returns before you name a date, or you will say a different day than their billing page shows. You cannot change any of it: plan changes, top-ups and cards are theirs to do on Settings → Billing. Not for where the credits went — that is `billing.usage_summary`.",
        "tags": [
          "billing"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {},
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` whenever the call did not succeed, including when the tool itself returned a typed `ok: false` — this tool runs at account level, so there is no workspace boundary to distinguish. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "plan_key": {
                          "type": "string"
                        },
                        "plan_name": {
                          "type": "string"
                        },
                        "price_cents": {
                          "type": "integer"
                        },
                        "interval": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "subscription_status": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "subscribed": {
                          "type": "boolean"
                        },
                        "renews_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "credit_balance": {
                          "type": "number"
                        },
                        "monthly_allotment": {
                          "type": "number"
                        },
                        "out_of_credits": {
                          "type": "boolean"
                        },
                        "auto_top_up_enabled": {
                          "type": "boolean"
                        },
                        "auto_top_up_disabled_after_failure": {
                          "type": "boolean"
                        },
                        "card_on_file": {
                          "type": "boolean"
                        },
                        "non_card_method_type": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "receipts": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "paid_at": {
                                "type": "string"
                              },
                              "description": {
                                "type": "string"
                              },
                              "amount_minor_units": {
                                "type": "integer"
                              },
                              "currency": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "paid_at",
                              "description",
                              "amount_minor_units",
                              "currency"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "account_visible": {
                          "type": "boolean"
                        },
                        "no_charge": {
                          "type": "boolean"
                        },
                        "partial_reads": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "display_time_zone": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "ok",
                        "account_visible",
                        "auto_top_up_disabled_after_failure",
                        "auto_top_up_enabled",
                        "card_on_file",
                        "credit_balance",
                        "display_time_zone",
                        "interval",
                        "monthly_allotment",
                        "no_charge",
                        "non_card_method_type",
                        "out_of_credits",
                        "partial_reads",
                        "plan_key",
                        "plan_name",
                        "price_cents",
                        "receipts",
                        "renews_at",
                        "subscribed",
                        "subscription_status"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/billing.usage_summary": {
      "post": {
        "operationId": "call_billing_usage_summary",
        "summary": "Call billing.usage_summary",
        "description": "Say where the account's credits went — 'where did my credits go?', 'what used up my balance this month?', 'which brand is spending the most?'.  Read one calendar month of credit consumption — the total spent, the split per workspace, and a tail of the itemized ledger. Use it before answering any 'where did my credits go' question rather than reasoning from memory. Ledger instants are ISO-8601 UTC — convert them into the `display_time_zone` this returns before you name a day. Not for the plan and balance today — that is `billing.plan_status`.",
        "tags": [
          "billing"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "month": {
                    "description": "Which calendar month to summarize, as YYYY-MM. Leave it out for the current month. Never guess a month they did not name.",
                    "type": "string",
                    "pattern": "^\\d{4}-(0[1-9]|1[0-2])$"
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` whenever the call did not succeed, including when the tool itself returned a typed `ok: false` — this tool runs at account level, so there is no workspace boundary to distinguish. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "month": {
                          "type": "string"
                        },
                        "spent_credits": {
                          "type": "number"
                        },
                        "workspace_rollup": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "workspace_id": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "workspace_name": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "credits": {
                                "type": "number"
                              },
                              "event_count": {
                                "type": "integer"
                              }
                            },
                            "required": [
                              "workspace_id",
                              "workspace_name",
                              "credits",
                              "event_count"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "recent_entries": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "occurred_at": {
                                "type": "string"
                              },
                              "entry_kind": {
                                "type": "string"
                              },
                              "activity_key": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "workspace_name": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "credits": {
                                "type": "number"
                              }
                            },
                            "required": [
                              "occurred_at",
                              "entry_kind",
                              "activity_key",
                              "workspace_name",
                              "credits"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "more_entries": {
                          "type": "boolean"
                        },
                        "display_time_zone": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "ok",
                        "display_time_zone",
                        "month",
                        "more_entries",
                        "recent_entries",
                        "spent_credits",
                        "workspace_rollup"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/approvals.get_item": {
      "post": {
        "operationId": "call_approvals_get_item",
        "summary": "Call approvals.get_item",
        "description": "Say what ONE thing waiting for a decision actually is — 'what am I approving here?', 'what's this one?', 'why is this waiting on me?'.  Read ONE thing waiting for a decision, by its id ('<kind>:<sourceId>') — what it is, what it says, whether this person can decide it, how long it has waited, and whether a reviewer already has it open. Works for every kind in the review queue, not just assets. Use it for the item on the screen the person is looking at. Check 'status': 'found' means the item is described; 'not_in_queue' means it is decided already or was never theirs; 'source_unavailable' means the read FAILED and nothing is known about it — say so and offer to try again, never say it was decided. Read-only. You can read what is waiting, get an item ready, and ASK a person to decide. You can never approve, reject, or decide anything yourself — say who it is waiting on and stop there. Not for the whole queue of waiting work — that is `approvals.list_queue`.\n\nEvery 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.",
        "tags": [
          "approvals"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "itemId": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 64,
                    "description": "The review item's id, in the form '<kind>:<sourceId>' (for example 'asset:3f2c…'). Take it from the item currently on screen — it is named in the surface data — or from a row you have already read. Never invent one."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "itemId"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "found",
                            "not_in_queue",
                            "source_unavailable"
                          ]
                        },
                        "item": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "itemId": {
                                  "type": "string"
                                },
                                "kind": {
                                  "type": "string"
                                },
                                "title": {
                                  "type": "string"
                                },
                                "detail": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "canViewerDecide": {
                                  "type": "boolean"
                                },
                                "waitingFor": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "dueAt": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "pickedUp": {
                                  "type": "boolean"
                                }
                              },
                              "required": [
                                "itemId",
                                "kind",
                                "title",
                                "detail",
                                "canViewerDecide",
                                "waitingFor",
                                "dueAt",
                                "pickedUp"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "item",
                        "status",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/inbox.list_threads": {
      "post": {
        "operationId": "call_inbox_list_threads",
        "summary": "Call inbox.list_threads",
        "description": "Show what has come into the inbox — 'what's in my inbox?', 'has anyone messaged me?', 'any new reviews?'.  Read the workspace's AI-inbox conversations — email, SMS, Messenger, Instagram DMs and Google reviews — including any drafted reply waiting for a human decision. Call this before answering any question about the inbox or before drafting, approving or discarding a reply; never guess a message id. Not for writing a reply — that is `inbox.draft_reply`.\n\nEvery 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.",
        "tags": [
          "inbox"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "waiting_only": {
                    "description": "Only threads with a reply waiting for a human decision.",
                    "type": "boolean"
                  },
                  "limit": {
                    "description": "How many threads to return, most recently active first. Default 4, maximum 100.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 100
                  },
                  "cursor": {
                    "description": "Where to continue: pass the `next_cursor` from the previous page, with the same filters. Omit it for the first page.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 512
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "threads": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "conversation_id": {
                                "type": "string"
                              },
                              "channel": {
                                "type": "string"
                              },
                              "person": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "last_inbound_at": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "last_customer_message": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "reply_policy": {
                                "type": "string"
                              },
                              "waiting_reply": {
                                "anyOf": [
                                  {
                                    "type": "object",
                                    "properties": {
                                      "message_id": {
                                        "type": "string"
                                      },
                                      "draft": {
                                        "type": "string"
                                      },
                                      "drafted_at": {
                                        "type": "string"
                                      }
                                    },
                                    "required": [
                                      "message_id",
                                      "draft",
                                      "drafted_at"
                                    ],
                                    "additionalProperties": false
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "conversation_id",
                              "channel",
                              "person",
                              "last_inbound_at",
                              "last_customer_message",
                              "reply_policy",
                              "waiting_reply"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "counts": {
                          "type": "object",
                          "properties": {
                            "total": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "waiting": {
                              "type": "integer",
                              "minimum": 0
                            }
                          },
                          "required": [
                            "total",
                            "waiting"
                          ],
                          "additionalProperties": false
                        },
                        "next_cursor": {
                          "description": "Present when there is another page: pass it back as `cursor` to read it. Absent on the last page.",
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "counts",
                        "threads",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/inbox.draft_reply": {
      "post": {
        "operationId": "call_inbox_draft_reply",
        "summary": "Call inbox.draft_reply",
        "description": "Write a reply to someone who wrote in — 'draft a reply to that message', 'write something back to them', 'answer this one for me'.  Write a fresh AI reply for one inbox conversation, using the account's response instructions and the thread so far. The reply lands in the reviews queue for a human to approve, edit or discard — this tool NEVER sends anything. Not for sending a reply that is already waiting — that is `inbox.approve_and_send`. 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.\n\nEvery 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.",
        "tags": [
          "inbox"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "conversation_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The thread to draft a reply for, from inbox.list_threads."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "conversation_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "conversation_id": {
                          "type": "string"
                        },
                        "drafted": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/inbox.set_entity_reply_instructions": {
      "post": {
        "operationId": "call_inbox_set_entity_reply_instructions",
        "summary": "Call inbox.set_entity_reply_instructions",
        "description": "Set how to reply to people writing in about ONE specific thing — 'anyone asking about this ad should be told we're booked out', 'reply differently to people from this sequence', 'special wording for enquiries on this page'.  Set how the AI inbox replies to someone writing in about ONE specific thing — this ad campaign, this email sequence, this page, this post. It is the most specific layer, so it governs where it disagrees with the account-wide or channel wording. Pass an empty string to clear it, or exclusive=true to make it the whole prompt apart from pinned hard rules. Not for the account-wide wording — that is `inbox.set_reply_instructions`.\n\nEvery 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.",
        "tags": [
          "inbox"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "entity_kind": {
                    "type": "string",
                    "enum": [
                      "email_campaign",
                      "email_sequence",
                      "ad_campaign",
                      "page",
                      "post"
                    ],
                    "description": "What kind of thing these instructions belong to."
                  },
                  "entity_id": {
                    "type": "string",
                    "description": "The id of the campaign, page or post."
                  },
                  "instructions": {
                    "type": "string",
                    "description": "How the inbox should reply to someone writing in about this one thing. Empty clears it."
                  },
                  "exclusive": {
                    "description": "Optional. True makes these instructions the whole prompt for replies about this thing — the account-wide and channel wording are dropped, apart from pinned hard rules. Leave it out to keep the current setting.",
                    "type": "boolean"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "entity_kind",
                  "entity_id",
                  "instructions"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "entity": {
                          "type": "string",
                          "description": "The plain-language kind of thing that was written."
                        },
                        "cleared": {
                          "type": "boolean"
                        },
                        "exclusive": {
                          "type": "boolean",
                          "description": "Whether this entity's instructions now replace the account-wide and channel wording entirely, apart from pinned hard rules."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "cleared",
                        "entity",
                        "exclusive",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/inbox.set_thread_state": {
      "post": {
        "operationId": "call_inbox_set_thread_state",
        "summary": "Call inbox.set_thread_state",
        "description": "Park or reopen one conversation — 'snooze this until Monday', 'close this one off', 'reopen that thread'.  Park or reopen ONE inbox conversation — snooze it until a time you name, close it, or reopen a snoozed or closed one. This changes only where the conversation sits in the inbox: it sends nothing to the customer and cannot be used to reply. Not for replying to the customer — that is `inbox.draft_reply`.\n\nEvery 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.",
        "tags": [
          "inbox"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "conversation_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The thread to park or reopen, from inbox.list_threads."
                  },
                  "state": {
                    "type": "string",
                    "enum": [
                      "open",
                      "snoozed",
                      "closed"
                    ],
                    "description": "open reopens the conversation; snoozed hides it until snoozed_until; closed files it away."
                  },
                  "snoozed_until": {
                    "description": "When a snoozed conversation should come back, as an ISO-8601 timestamp in the future. Required for snoozed, ignored otherwise.",
                    "type": "string"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "conversation_id",
                  "state"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "conversation_id": {
                          "type": "string"
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "open",
                            "snoozed",
                            "closed"
                          ]
                        },
                        "snoozed_until": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "conversation_id",
                        "snoozed_until",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/inbox.set_channel_autonomy": {
      "post": {
        "operationId": "call_inbox_set_channel_autonomy",
        "summary": "Call inbox.set_channel_autonomy",
        "description": "Decide whether one channel's replies go out on their own or always wait for the member — 'let it reply to SMS by itself', 'I want to approve every Instagram reply', 'stop it sending without me'.  Change whether ONE inbox channel sends its replies on its own or always waits for the operator. Setting a channel to send on its own removes the human tap from every future reply there. Call it on the ask: it raises the approval card showing how that channel replies now and after, which is the member's confirmation, so it can still be declined after you call it. Not for how that channel's replies sound — that is `inbox.set_channel_reply_instructions`. 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.\n\nEvery 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.",
        "tags": [
          "inbox"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "channel": {
                    "type": "string",
                    "enum": [
                      "email",
                      "sms",
                      "messenger",
                      "ig_dm",
                      "gbp_review",
                      "fb_comment",
                      "ig_comment"
                    ],
                    "description": "Which channel to change."
                  },
                  "mode": {
                    "type": "string",
                    "enum": [
                      "suggest",
                      "auto"
                    ],
                    "description": "suggest — every reply waits for the operator. auto — replies on this channel go out on their own."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "channel",
                  "mode"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "channel": {
                          "type": "string"
                        },
                        "mode": {
                          "type": "string",
                          "enum": [
                            "suggest",
                            "auto"
                          ]
                        },
                        "effect": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/email_template.save_draft": {
      "post": {
        "operationId": "call_email_template_save_draft",
        "summary": "Call email_template.save_draft",
        "description": "Change an email template without changing any email that wears it — 'make the header darker', 'swap the footer on the newsletter template', 'change the template's subject line'. It saves into the template's draft, opening one from the version emails send now when none is open; every email wearing the template keeps sending its current version until the draft is finalized. Leave a field out to keep it as it stands. Read the template with `email_template.list_versions` first for its id, its design and the open draft's revision, and pass that revision back. Not for applying the change to the emails that wear it — that is `email_template.finalize_and_apply`.\n\nEvery 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.",
        "tags": [
          "email_template"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "template_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The email template, as `email_template.list_versions` or `email_template.create` named it."
                  },
                  "mjml_source": {
                    "description": "The template's whole design as MJML. Leave it out to keep the design as it stands and change only the subject or regions.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 500000
                  },
                  "subject": {
                    "description": "The template's own subject line. Leave it out to keep it; null clears it.",
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 200
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "content": {
                    "description": "The editor's region overrides as one JSON object. Leave it out to keep them; null clears them.",
                    "anyOf": [
                      {
                        "type": "object",
                        "propertyNames": {
                          "type": "string"
                        },
                        "additionalProperties": {}
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "expected_revision": {
                    "description": "The open draft's revision as `email_template.list_versions` or the last save reported it. Leave it out only when no draft is open.",
                    "type": "integer",
                    "minimum": 1
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "template_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "template_id": {
                          "type": "string"
                        },
                        "draft_version": {
                          "type": "number"
                        },
                        "revision": {
                          "type": "number"
                        },
                        "current_version": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "current_version",
                        "draft_version",
                        "revision",
                        "template_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/email_template.finalize_and_apply": {
      "post": {
        "operationId": "call_email_template_finalize_and_apply",
        "summary": "Call email_template.finalize_and_apply",
        "description": "Make a template's draft the version every email wearing it sends — 'apply the new template', 'finalize the template', 'put the new template on my emails'. This changes what real contacts receive from that moment on, so calling it raises the approval card, which shows the final emails and active automations that wear the template and is the member's confirmation; call it on the ask. The version emails sent before stays in the history and can be restored. Not for saving changes — that is `email_template.save_draft`. 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.\n\nEvery 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.",
        "tags": [
          "email_template"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "template_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The email template, as `email_template.list_versions` or `email_template.create` named it."
                  },
                  "change_note": {
                    "description": "A short note on what changed, kept in the version history.",
                    "type": "string",
                    "maxLength": 500
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "template_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "template_id": {
                          "type": "string"
                        },
                        "version": {
                          "type": "number"
                        },
                        "finalized_at": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/email_template.discard_draft": {
      "post": {
        "operationId": "call_email_template_discard_draft",
        "summary": "Call email_template.discard_draft",
        "description": "Throw away a template's unfinalized changes — 'scrap those template edits', 'discard the template draft'. It deletes the open draft; emails keep sending the current version and nothing any email sends changes, but the unfinalized changes cannot be recovered, so calling it raises the approval card, which is the member's confirmation; call it on the ask. Not for undoing a version already applied — restore an earlier one with `email_template.restore_version`. 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.\n\nEvery 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.",
        "tags": [
          "email_template"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "template_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The email template, as `email_template.list_versions` or `email_template.create` named it."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "template_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "template_id": {
                          "type": "string"
                        },
                        "discarded_version": {
                          "type": "number"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/email_template.list_versions": {
      "post": {
        "operationId": "call_email_template_list_versions",
        "summary": "Call email_template.list_versions",
        "description": "Show a template's version history — 'which version of the newsletter template are my emails using', 'show the template's versions', 'is there an unfinished draft of this template'. With a template id it answers which version emails send, who finalized each version, whether a draft is open (with the revision a save passes back) and the design that draft — else the current version — holds; without one it lists the workspace's templates and the version each sends. It only reads. Not for changing a template — that is `email_template.save_draft`.\n\nEvery 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.",
        "tags": [
          "email_template"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "template_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The email template whose history to show. Leave it out to list the workspace's templates with the version each sends."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "templates": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "template_id": {
                                "type": "string"
                              },
                              "name": {
                                "type": "string"
                              },
                              "current_version": {
                                "anyOf": [
                                  {
                                    "type": "number"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "draft_open": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "template_id",
                              "name",
                              "current_version",
                              "draft_open"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "template": {
                          "type": "object",
                          "properties": {
                            "template_id": {
                              "type": "string"
                            },
                            "name": {
                              "type": "string"
                            },
                            "archived": {
                              "type": "boolean"
                            },
                            "current_version": {
                              "anyOf": [
                                {
                                  "type": "number"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "draft": {
                              "anyOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "version": {
                                      "type": "number"
                                    },
                                    "revision": {
                                      "type": "number"
                                    },
                                    "saved_by": {
                                      "anyOf": [
                                        {
                                          "type": "string"
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    },
                                    "saved_at": {
                                      "type": "string"
                                    }
                                  },
                                  "required": [
                                    "version",
                                    "revision",
                                    "saved_by",
                                    "saved_at"
                                  ],
                                  "additionalProperties": false
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "versions": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "version_id": {
                                    "type": "string"
                                  },
                                  "version": {
                                    "type": "number"
                                  },
                                  "status": {
                                    "type": "string",
                                    "enum": [
                                      "draft",
                                      "current",
                                      "superseded"
                                    ]
                                  },
                                  "finalized_at": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "finalized_by": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "change_note": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "version_id",
                                  "version",
                                  "status",
                                  "finalized_at",
                                  "finalized_by",
                                  "change_note"
                                ],
                                "additionalProperties": false
                              }
                            },
                            "working_copy": {
                              "type": "object",
                              "properties": {
                                "version": {
                                  "type": "number"
                                },
                                "subject": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "mjml_source": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "design_withheld": {
                                  "type": "boolean"
                                }
                              },
                              "required": [
                                "version",
                                "subject",
                                "mjml_source",
                                "design_withheld"
                              ],
                              "additionalProperties": false
                            }
                          },
                          "required": [
                            "template_id",
                            "name",
                            "archived",
                            "current_version",
                            "draft",
                            "versions",
                            "working_copy"
                          ],
                          "additionalProperties": false
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/email_template.restore_version": {
      "post": {
        "operationId": "call_email_template_restore_version",
        "summary": "Call email_template.restore_version",
        "description": "Bring back an earlier version of a template as a new draft — 'go back to last week's template', 'restore version 2 of the newsletter template'. It opens a draft whose design is that version's; history is never rewritten, and nothing changes for any email until the draft is finalized with `email_template.finalize_and_apply`. It is refused while another draft is open. Not for throwing a draft away — that is `email_template.discard_draft`.\n\nEvery 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.",
        "tags": [
          "email_template"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "template_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The email template, as `email_template.list_versions` or `email_template.create` named it."
                  },
                  "version": {
                    "type": "integer",
                    "minimum": 1,
                    "description": "The version number to bring back, as `email_template.list_versions` showed it."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "template_id",
                  "version"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "template_id": {
                          "type": "string"
                        },
                        "draft_version": {
                          "type": "number"
                        },
                        "revision": {
                          "type": "number"
                        },
                        "restored_from_version": {
                          "type": "number"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "draft_version",
                        "restored_from_version",
                        "revision",
                        "template_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/email_template.archive": {
      "post": {
        "operationId": "call_email_template_archive",
        "summary": "Call email_template.archive",
        "description": "Retire a template from the picker — 'delete that template', 'archive the old promo template'. Archiving is one way and discards any open draft; emails already wearing the template keep sending its current version. Calling it raises the approval card, which names the emails wearing it and is the member's confirmation; call it on the ask. Not for changing its design — that is `email_template.save_draft`. 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.\n\nEvery 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.",
        "tags": [
          "email_template"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "template_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The email template, as `email_template.list_versions` or `email_template.create` named it."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "template_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "template_id": {
                          "type": "string"
                        },
                        "archived_at": {
                          "type": "string"
                        },
                        "discarded_draft": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/inbox.approve_and_send": {
      "post": {
        "operationId": "call_inbox_approve_and_send",
        "summary": "Call inbox.approve_and_send",
        "description": "Send a waiting reply to the customer, or throw it away — 'send that reply', 'yes, approve it', 'bin that draft'.  Approve a waiting inbox reply and SEND it to the customer, or discard it. Approving transmits a real message on the account's own email, SMS or messaging channel, so it stops at the approval gate and only a recorded human decision releases it. Not for writing a new reply — that is `inbox.draft_reply`. 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.\n\nEvery 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.",
        "tags": [
          "inbox"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "message_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The waiting reply, from inbox.list_threads."
                  },
                  "decision": {
                    "type": "string",
                    "enum": [
                      "approve",
                      "discard"
                    ],
                    "description": "approve sends the reply; discard records that it will not go."
                  },
                  "edited_reply": {
                    "description": "The reply text to send instead of the drafted one. Only for approve.",
                    "type": "string"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "message_id",
                  "decision"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "message_id": {
                          "type": "string"
                        },
                        "decision": {
                          "type": "string",
                          "enum": [
                            "approve",
                            "discard"
                          ]
                        },
                        "channel": {
                          "type": "string"
                        },
                        "edited": {
                          "type": "boolean"
                        },
                        "sent": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/inbox.delete_comment": {
      "post": {
        "operationId": "call_inbox_delete_comment",
        "summary": "Call inbox.delete_comment",
        "description": "Delete a comment off the brand's public post for good — 'delete that comment', 'get rid of that comment permanently', 'remove what they wrote'. ⚠️ This destroys someone else's words and CANNOT be undone by anything here. Calling it raises the approval card showing the comment, which is the operator's confirmation, and it deletes only once they approve there, so it can still be refused after you call it. Not for simply taking a comment out of public view — that is `inbox.hide_comment`, which can be undone. 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.\n\nEvery 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.",
        "tags": [
          "inbox"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "message_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The comment's inbox message id, taken from inbox.list_threads — never invented."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "message_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "deleted": {
                          "type": "boolean",
                          "const": true
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/inbox.hide_comment": {
      "post": {
        "operationId": "call_inbox_hide_comment",
        "summary": "Call inbox.hide_comment",
        "description": "Hide a comment on the brand's public post, or put it back — 'hide that comment', 'take that comment down', 'unhide the one I hid'.  Hide a comment from the brand's public Facebook or Instagram post, or unhide one. Hiding is REVERSIBLE and is what to reach for when a comment should come down — prefer it over inbox.delete_comment, which cannot be undone. The commenter is not told, and nothing is sent to them. Not for deleting the comment for good — that is `inbox.delete_comment`. 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.\n\nEvery 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.",
        "tags": [
          "inbox"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "message_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The comment's inbox message id, taken from inbox.list_threads — never invented."
                  },
                  "hidden": {
                    "type": "boolean",
                    "description": "true hides the comment from the public post; false unhides it."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "message_id",
                  "hidden"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "hidden": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/inbox.set_reply_instructions": {
      "post": {
        "operationId": "call_inbox_set_reply_instructions",
        "summary": "Call inbox.set_reply_instructions",
        "description": "Set how the inbox should reply in general — 'always offer a call', 'never quote prices', 'reply in a friendlier tone'.  Set the account's standing instructions for how the AI inbox replies — tone, what to offer, what never to say. These apply on every channel; per-channel wording rides inbox.set_channel_reply_instructions. Pass an empty string to clear them. Not for one channel's own wording — that is `inbox.set_channel_reply_instructions`.",
        "tags": [
          "inbox"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "instructions": {
                    "type": "string",
                    "description": "How the inbox should reply, in the account's own words. Empty clears it."
                  }
                },
                "required": [
                  "instructions"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` whenever the call did not succeed, including when the tool itself returned a typed `ok: false` — this tool runs at account level, so there is no workspace boundary to distinguish. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "layer": {
                          "type": "string"
                        },
                        "cleared": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "ok",
                        "cleared",
                        "layer"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/inbox.set_channel_reply_instructions": {
      "post": {
        "operationId": "call_inbox_set_channel_reply_instructions",
        "summary": "Call inbox.set_channel_reply_instructions",
        "description": "Set how replies should sound on ONE channel — 'keep SMS replies short', 'be more formal on Google reviews', 'reply differently on Instagram'.  Set how the AI inbox replies on ONE channel — shorter for SMS, more formal for Google reviews, and so on. These sit under the account-wide instructions and govern where the two disagree. Pass an empty string to clear the channel's own wording. Not for whether that channel sends on its own — that is `inbox.set_channel_autonomy`.",
        "tags": [
          "inbox"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "channel": {
                    "type": "string",
                    "enum": [
                      "email",
                      "sms",
                      "messenger",
                      "ig_dm",
                      "gbp_review",
                      "fb_comment",
                      "ig_comment"
                    ],
                    "description": "Which channel these instructions apply to."
                  },
                  "instructions": {
                    "type": "string",
                    "description": "How the inbox should reply on that channel. Empty clears it."
                  }
                },
                "required": [
                  "channel",
                  "instructions"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` whenever the call did not succeed, including when the tool itself returned a typed `ok: false` — this tool runs at account level, so there is no workspace boundary to distinguish. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "layer": {
                          "type": "string"
                        },
                        "cleared": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "ok",
                        "cleared",
                        "layer"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/email_sequence.set_finality": {
      "post": {
        "operationId": "call_email_sequence_set_finality",
        "summary": "Call email_sequence.set_finality",
        "description": "Accept one email as final, or reopen it to edit — 'that one's good, lock it in', 'I'm happy with email three', 'let me change that one again'.  Accept one email as final, or reopen a final email for editing. Marking an email final is the operator accepting it, so call it when they say so, never on your own judgement. It sends nothing. Not for editing the email's words — that is `email_block.save`.\n\nEvery 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.",
        "tags": [
          "email_sequence"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The email block to mark final, or take back to draft."
                  },
                  "final": {
                    "type": "boolean",
                    "description": "true to accept the email as final; false to reopen it for editing."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "email_id",
                  "final"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "final": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "final",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/email_campaign.draft": {
      "post": {
        "operationId": "call_email_campaign_draft",
        "summary": "Call email_campaign.draft",
        "description": "Draft this week's email campaign — 'write this week's email', 'draft the newsletter', 'put together an email about the new offer'.  Draft this week's email campaign from the operator's brief. It creates a DRAFT in the Emails board and sends nothing to anyone — say that plainly, and never imply the campaign has gone out. Ask for the brief rather than inventing one. Calling it raises the approval card, which is the operator's confirmation, so call it on the ask; it drafts once they approve. Not for a multi-email sequence — that is `email_sequence.create`. 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.\n\nEvery 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.",
        "tags": [
          "email_campaign"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "What to call this week's campaign — the name the operator will see in the drafts list."
                  },
                  "brief": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 4000,
                    "description": "What this week's campaign is about, in the operator's own words. Never invent one: ask if you do not have it."
                  },
                  "brand_context": {
                    "description": "Optional extra tone or positioning grounding. Leave it out unless the operator gave you something specific.",
                    "type": "string",
                    "maxLength": 4000
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "name",
                  "brief"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "template_id": {
                          "type": "string"
                        },
                        "subject": {
                          "type": "string"
                        },
                        "agent_run_id": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/keyword_research.read": {
      "post": {
        "operationId": "call_keyword_research_read",
        "summary": "Call keyword_research.read",
        "description": "Check the keyword sweeps this workspace has already run — 'what keywords have we already researched', 'what's the search volume for this term we looked up'. Read the keyword sweeps this workspace has ALREADY run — the seed term, each keyword's monthly volume and difficulty band (low/medium/high), and the SERP results where the provider returned them. Call this FIRST whenever the operator asks about search demand: a sweep costs credits, and the answer is often one we already bought. A sweep with status `partial` served the keyword half and not the SERP half — say so rather than reporting the SERP as empty. Not for running a new sweep — that is `keyword_research.sweep`.\n\nEvery 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.",
        "tags": [
          "keyword_research"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "description": "Optional case-insensitive substring of the seed term. Omit to read the most recent sweeps.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "limit": {
                    "default": 5,
                    "description": "How many sweeps to return. 1-20; defaults to 5.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 20
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "sweeps": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "sweep_id": {
                                "type": "string"
                              },
                              "query": {
                                "type": "string"
                              },
                              "status": {
                                "type": "string"
                              },
                              "ran_at": {
                                "type": "string"
                              },
                              "rows": {
                                "type": "array",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "keyword": {
                                      "type": "string"
                                    },
                                    "volume": {
                                      "anyOf": [
                                        {
                                          "type": "number"
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    },
                                    "difficulty": {
                                      "anyOf": [
                                        {
                                          "type": "string"
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    }
                                  },
                                  "required": [
                                    "keyword",
                                    "volume",
                                    "difficulty"
                                  ],
                                  "additionalProperties": false
                                }
                              },
                              "serp_results": {
                                "type": "array",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "title": {
                                      "type": "string"
                                    },
                                    "url": {
                                      "type": "string"
                                    },
                                    "snippet": {
                                      "anyOf": [
                                        {
                                          "type": "string"
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    }
                                  },
                                  "required": [
                                    "title",
                                    "url",
                                    "snippet"
                                  ],
                                  "additionalProperties": false
                                }
                              },
                              "total_row_count": {
                                "type": "integer",
                                "minimum": 0
                              }
                            },
                            "required": [
                              "sweep_id",
                              "query",
                              "status",
                              "ran_at",
                              "rows",
                              "serp_results",
                              "total_row_count"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "query_filter": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "query_filter",
                        "sweeps",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/keyword_research.sweep": {
      "post": {
        "operationId": "call_keyword_research_sweep",
        "summary": "Call keyword_research.sweep",
        "description": "Kick off a new keyword sweep on a seed term — 'research keywords for coffee shops near me', 'look up search volume for this term'. Run a NEW keyword sweep on a seed term and file it on a board. This calls a paid provider and CHARGES the workspace credits, so check keyword_research.read first — a sweep we already ran costs nothing to re-read. When the member asked for it themselves it runs; otherwise they see an approve card first. Never say data came back until the tool has returned rows. Not for sweeps already run — that is `keyword_research.read`. 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.\n\nEvery 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.",
        "tags": [
          "keyword_research"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "The seed term to sweep, in the operator's own words."
                  },
                  "limit": {
                    "description": "How many keyword rows to ask for. 1-50; defaults to 10.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 50
                  },
                  "board_id": {
                    "description": "The board to file the sweep on, by id. Omit on a board conversation — the board you are standing on is used.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "board_name": {
                    "description": "The board to file the sweep on, by NAME — use this off a board when the operator names one (e.g. 'Launch ideas'). If neither this nor board_id is given and you are not on a board, the tool answers with the boards to choose from.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "query"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "sweep": {
                          "type": "object",
                          "properties": {
                            "sweep_id": {
                              "type": "string"
                            },
                            "query": {
                              "type": "string"
                            },
                            "status": {
                              "type": "string"
                            },
                            "ran_at": {
                              "type": "string"
                            },
                            "rows": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "keyword": {
                                    "type": "string"
                                  },
                                  "volume": {
                                    "anyOf": [
                                      {
                                        "type": "number"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "difficulty": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "keyword",
                                  "volume",
                                  "difficulty"
                                ],
                                "additionalProperties": false
                              }
                            },
                            "serp_results": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "title": {
                                    "type": "string"
                                  },
                                  "url": {
                                    "type": "string"
                                  },
                                  "snippet": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "title",
                                  "url",
                                  "snippet"
                                ],
                                "additionalProperties": false
                              }
                            },
                            "total_row_count": {
                              "type": "integer",
                              "minimum": 0
                            }
                          },
                          "required": [
                            "sweep_id",
                            "query",
                            "status",
                            "ran_at",
                            "rows",
                            "serp_results",
                            "total_row_count"
                          ],
                          "additionalProperties": false
                        },
                        "board_id": {
                          "type": "string"
                        },
                        "board_item_id": {
                          "type": "string"
                        },
                        "credits_consumed_thousandths": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/seo.serp_features": {
      "post": {
        "operationId": "call_seo_serp_features",
        "summary": "Call seo.serp_features",
        "description": "Break a Google results page down for SEO — 'what's the featured snippet for this term', 'which People Also Ask questions come up for this search', 'which sources does the AI Overview cite here'. A PAID, deep read of the LIVE Google results page for a query. It returns: who ranks organically, whether there is a featured snippet and who holds it, the People-Also-Ask questions, every SERP feature on the page, and Google's AI Overview with the sources it cites. This calls a paid provider and CHARGES the workspace credits, so ask it about the searches the operator actually named rather than exploring. `organic` carries EVERY result the requested `depth` bought — nothing is trimmed after the charge — so raise `depth` when the operator asks about results past the first page and report the whole list you get back. `ai_overview.present: true` with `resolved: false` means Google IS writing an answer for this query and the provider could not read it — say exactly that, and never report it as no overview. Not for a plain look at what Google shows or who ranks — that is `web.search` in 'serp' mode. 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.\n\nEvery 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.",
        "tags": [
          "seo"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200,
                    "description": "The search query to look up, in the operator's own words."
                  },
                  "depth": {
                    "description": "How many results to read. 1-20; defaults to 10. Higher costs more — only raise it when the operator asks about results past the first page.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 20
                  },
                  "location_name": {
                    "description": "The market to search from, by name (e.g. 'United States', 'United Kingdom'). Defaults to United States.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120
                  },
                  "language_name": {
                    "description": "The language to search in, by name (e.g. 'English'). Defaults to English.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "query"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "query": {
                          "type": "string"
                        },
                        "location_name": {
                          "type": "string"
                        },
                        "language_name": {
                          "type": "string"
                        },
                        "fetched_at": {
                          "type": "string"
                        },
                        "total_result_count": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "organic": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "rank": {
                                "type": "integer",
                                "exclusiveMinimum": 0
                              },
                              "title": {
                                "type": "string"
                              },
                              "url": {
                                "type": "string"
                              },
                              "domain": {
                                "type": "string"
                              },
                              "snippet": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "is_featured_snippet": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "rank",
                              "title",
                              "url",
                              "domain",
                              "snippet",
                              "is_featured_snippet"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "answer_block": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "kind": {
                                  "type": "string"
                                },
                                "title": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "url": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "domain": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              },
                              "required": [
                                "kind",
                                "title",
                                "url",
                                "domain"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "people_also_ask": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "feature_types": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "ai_overview": {
                          "type": "object",
                          "properties": {
                            "present": {
                              "type": "boolean"
                            },
                            "resolved": {
                              "type": "boolean"
                            },
                            "summary": {
                              "anyOf": [
                                {
                                  "type": "string"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "references": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "domain": {
                                    "type": "string"
                                  },
                                  "url": {
                                    "type": "string"
                                  },
                                  "title": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "source": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "domain",
                                  "url",
                                  "title",
                                  "source"
                                ],
                                "additionalProperties": false
                              }
                            }
                          },
                          "required": [
                            "present",
                            "resolved",
                            "summary",
                            "references"
                          ],
                          "additionalProperties": false
                        },
                        "credits_consumed_thousandths": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/seo.aeo_presence": {
      "post": {
        "operationId": "call_seo_aeo_presence",
        "summary": "Call seo.aeo_presence",
        "description": "Answer 'am I in the AI answer for this?' — for each search, whether Google wrote an AI Overview, whether this workspace's site is cited in it, which of our URLs it used, WHO ELSE it cited, where we rank organically on the same page, and whether we hold the featured snippet. Omit `domain` to use this workspace's own site. EACH SEARCH IS A SEPARATE PAID READ and charges credits, so pass only the searches the operator named — at most 5. `ai_overview_present: true` with `ai_overview_resolved: false` means there IS an overview and it could not be read: say that, never 'you are not cited'. `rows` may be SHORTER than the searches you asked about: when `queries_not_read` is non-empty the provider failed part-way, so name each of those searches as one you COULD NOT CHECK — never report them as not cited, and say only `queries_answered` of `queries_requested` were read. Not for the whole results page broken down — that is `seo.serp_features`. 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.\n\nEvery 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.",
        "tags": [
          "seo"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "queries": {
                    "minItems": 1,
                    "maxItems": 5,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 200
                    },
                    "description": "The searches to check, in the operator's own words. 1-5 per call; each one is a separate paid read, so ask for the ones they named rather than padding the list."
                  },
                  "domain": {
                    "description": "The site to look for, e.g. 'example.com'. Omit to use this workspace's own site.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 253
                  },
                  "location_name": {
                    "description": "The market to search from, by name. Defaults to United States.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120
                  },
                  "language_name": {
                    "description": "The language to search in, by name. Defaults to English.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "queries"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "domain": {
                          "type": "string"
                        },
                        "location_name": {
                          "type": "string"
                        },
                        "language_name": {
                          "type": "string"
                        },
                        "rows": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "query": {
                                "type": "string"
                              },
                              "ai_overview_present": {
                                "type": "boolean"
                              },
                              "ai_overview_resolved": {
                                "type": "boolean"
                              },
                              "cited": {
                                "type": "boolean"
                              },
                              "citation_rank": {
                                "anyOf": [
                                  {
                                    "type": "integer",
                                    "exclusiveMinimum": 0
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "cited_urls": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "competitor_domains": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "organic_rank": {
                                "anyOf": [
                                  {
                                    "type": "integer",
                                    "exclusiveMinimum": 0
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "holds_answer_block": {
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "query",
                              "ai_overview_present",
                              "ai_overview_resolved",
                              "cited",
                              "citation_rank",
                              "cited_urls",
                              "competitor_domains",
                              "organic_rank",
                              "holds_answer_block"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "queries_requested": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "queries_answered": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "queries_not_read": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "query": {
                                "type": "string"
                              },
                              "reason": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "query",
                              "reason"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "queries_with_ai_overview": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "queries_citing_domain": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "credits_consumed_thousandths": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/seo.backlinks_summary": {
      "post": {
        "operationId": "call_seo_backlinks_summary",
        "summary": "Call seo.backlinks_summary",
        "description": "Answer 'how strong is this site's link authority?' — how many sites link to it, how many referring domains and pages, its authority rank, its spam score, how many links are broken, and the composition of the profile (link types, nofollow share, top TLDs and countries). Omit `target` to use this workspace's own site. This calls a paid provider and CHARGES the workspace credits at a FLAT rate PER REQUEST — the same charge whether a profile is found or not — so use the exact domain the operator named rather than guessing. `has_profile: false` means the index has never seen that EXACT target: say so and name the target you looked up, because a typo produces the same answer as a genuinely unlinked site — never report it as 'your site has no backlinks' without naming what was checked. Not for one page's on-page audit — that is `seo.onpage_audit`. 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.\n\nEvery 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.",
        "tags": [
          "seo"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "target": {
                    "description": "The site to profile, e.g. 'example.com'. Omit to use this workspace's own site.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2048
                  },
                  "mode": {
                    "description": "'domain' (the default) profiles the whole site including subdomains; 'page' profiles exactly the URL given in `target`. Only pass 'page' when the operator asked about ONE page's links.",
                    "type": "string",
                    "enum": [
                      "domain",
                      "page"
                    ]
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "target": {
                          "type": "string"
                        },
                        "fetched_at": {
                          "type": "string"
                        },
                        "has_profile": {
                          "type": "boolean"
                        },
                        "rank": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "backlinks": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "referring_domains": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "referring_main_domains": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "referring_pages": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "referring_domains_nofollow": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "referring_ips": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "broken_backlinks": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "broken_pages": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "spam_score": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "crawled_pages": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "first_seen": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "link_types": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "label": {
                                "type": "string"
                              },
                              "count": {
                                "type": "integer",
                                "minimum": 0
                              }
                            },
                            "required": [
                              "label",
                              "count"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "link_attributes": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "label": {
                                "type": "string"
                              },
                              "count": {
                                "type": "integer",
                                "minimum": 0
                              }
                            },
                            "required": [
                              "label",
                              "count"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "referring_tlds": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "label": {
                                "type": "string"
                              },
                              "count": {
                                "type": "integer",
                                "minimum": 0
                              }
                            },
                            "required": [
                              "label",
                              "count"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "referring_countries": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "label": {
                                "type": "string"
                              },
                              "count": {
                                "type": "integer",
                                "minimum": 0
                              }
                            },
                            "required": [
                              "label",
                              "count"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "credits_consumed_thousandths": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/seo.onpage_audit": {
      "post": {
        "operationId": "call_seo_onpage_audit",
        "summary": "Call seo.onpage_audit",
        "description": "Audit one live page for SEO issues — 'audit our pricing page', 'what's wrong with this page's SEO'. Audit ONE live page: its title and description with their lengths, every H1, the canonical, whether it is served over HTTPS, whether it carries structured data and whether that data has errors, word count, internal and external link counts, load time, page size, and a list of what is wrong — critical issues first, then warnings. This calls a paid provider and CHARGES the workspace credits per page, so audit the page the operator named rather than crawling around it. `url` in the result is the page ACTUALLY audited and may differ from the one asked for when it redirected — if it does, say so. An empty `issues` list means the checks that were run all passed, not that the page is perfect. Not for the site's link authority — that is `seo.backlinks_summary`. 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.\n\nEvery 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.",
        "tags": [
          "seo"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2048,
                    "description": "The full page address to audit, including https://. One page per call."
                  },
                  "render_javascript": {
                    "description": "Whether to run the page's JavaScript before auditing. Leave it out — the default is on, which is right for almost every modern page. Pass false only when the operator specifically wants the raw HTML measured.",
                    "type": "boolean"
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "url"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "url": {
                          "type": "string"
                        },
                        "fetched_at": {
                          "type": "string"
                        },
                        "status_code": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "onpage_score": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "title": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "title_length": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description_length": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "h1": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "canonical": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "is_https": {
                          "anyOf": [
                            {
                              "type": "boolean"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "has_structured_data": {
                          "anyOf": [
                            {
                              "type": "boolean"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "structured_data_has_errors": {
                          "anyOf": [
                            {
                              "type": "boolean"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "word_count": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "internal_links_count": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "external_links_count": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "images_count": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "load_time_ms": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "time_to_interactive_ms": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "page_size_bytes": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "has_broken_resources": {
                          "anyOf": [
                            {
                              "type": "boolean"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "has_broken_links": {
                          "anyOf": [
                            {
                              "type": "boolean"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "issues": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "check": {
                                "type": "string"
                              },
                              "severity": {
                                "type": "string",
                                "enum": [
                                  "critical",
                                  "warning"
                                ]
                              }
                            },
                            "required": [
                              "check",
                              "severity"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "credits_consumed_thousandths": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/browser.read": {
      "post": {
        "operationId": "call_browser_read",
        "summary": "Call browser.read",
        "description": "Drive a real browser to a page on a site this workspace has APPROVED for browsing and pull named fields off it — 'use the browser to pull the prices off our supplier's page', 'open our approved site in the browser and read the plan table'. Open a web page this workspace has approved for browsing and READ it — pull named fields off it, or answer a question about what is on it. This one is for the approved sites that need a real browser. It only reaches sites the workspace has added on Settings → Assistant → Browser; anything else is refused with the domain to add. It reads and never types, clicks through a form, signs in, or changes anything on the page. Not for an ordinary link someone pastes, or any site to just read — that is `web.read`. 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.\n\nEvery 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.",
        "tags": [
          "browser"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2048,
                    "description": "The page to open, as a full https:// address. It must be on a site the workspace has approved for browsing; anything else is refused with the site to add."
                  },
                  "task": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 500,
                    "description": "What to do on the page, in plain words — for example 'read the pricing table' or 'does this page still say the plan includes support?'."
                  },
                  "extract": {
                    "description": "The named fields to pull off the page. Omit for a plain look, which returns the page's own answer to the task instead of a structured object.",
                    "minItems": 1,
                    "maxItems": 20,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 64,
                          "description": "The key this field lands under in the result."
                        },
                        "description": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 200,
                          "description": "What to look for on the page."
                        },
                        "type": {
                          "description": "The shape to coerce it to. Defaults to string.",
                          "type": "string",
                          "enum": [
                            "string",
                            "number",
                            "boolean"
                          ]
                        }
                      },
                      "required": [
                        "name",
                        "description"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "max_minutes": {
                    "description": "Wall-clock ceiling for this one read, 1-5. Defaults to 2. The account's own limits still apply and are lower in some cases.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 5
                  },
                  "resume_read_id": {
                    "description": "Only when an earlier call said the browser is still reading this page: the read id it gave, with the same url, task and extract, to collect that read rather than start another. Omit it otherwise.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 64
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "url",
                  "task"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "run_id": {
                          "type": "string"
                        },
                        "adapter": {
                          "type": "string"
                        },
                        "hosts_touched": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "extracted": {
                          "anyOf": [
                            {},
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "summary": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "screenshot_ids": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "action_count": {
                          "type": "number"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/browser.add_domain": {
      "post": {
        "operationId": "call_browser_add_domain",
        "summary": "Call browser.add_domain",
        "description": "Add ONE site to this workspace's browsing list, so you are allowed to open pages on it — 'add our supplier's site to the browsing list', 'let the browser open that site'. Use this the moment a browser read is refused because the site is not on the list — offer it in the same reply rather than sending the operator to a settings screen. It does NOT add anything on its own: the operator sees an approve card for it in the chat first, and only an account Owner or Admin can approve it. Pass the page you were trying to read as `resume_url` and it is handed back once the site is added, so you can read it without asking again. Not for reading the page once the site is on the list — that is `browser.read`. 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.\n\nEvery 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.",
        "tags": [
          "browser"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "domain": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 253,
                    "description": "The site to add to this workspace's browsing list, written plainly — for example 'example.com' or 'docs.example.org'. Never a full page address."
                  },
                  "purpose": {
                    "description": "One line saying why this site is needed, in the operator's own words. It is shown on the approval card.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "resume_url": {
                    "description": "The page you were asked to read and could not, if there was one. It is handed back after the site is added so you can read it without asking again.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2048
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "domain"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "domain": {
                          "type": "string"
                        },
                        "added": {
                          "type": "boolean"
                        },
                        "allowed_domains": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "resume_url": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/browser.remove_domain": {
      "post": {
        "operationId": "call_browser_remove_domain",
        "summary": "Call browser.remove_domain",
        "description": "Take ONE site off this workspace's browsing list — the allowed sites your browser may open — so you may no longer open pages on it: 'remove example.com from the browsing list', 'stop letting the browser open that site', 'take our old supplier off the allowed sites'. Use it whenever the operator wants you to stop visiting a site or to withdraw browser access to it; the list is this workspace's own setting, and this verb is how you change it. Call it on every such ask, even when earlier messages or what you remember say the site was already taken off: the list also changes on the Settings screen and by other people, and only this call reads it as it is now. Name the site as it is written on the list, like 'example.com'. Calling it raises the approval card, so call it on the ask; only an account Owner or Admin can approve it, and once approved the site stays off the list until someone adds it again. A site that is not on the list is left as it is, and nothing is charged. Not for adding a site to the list — that is `browser.add_domain`. 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.\n\nEvery 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.",
        "tags": [
          "browser"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "domain": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 253,
                    "description": "The site to take off this workspace's browsing list, written as it appears on the list — for example 'example.com'."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "domain"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "const": "confirmation_required"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "domain": {
                          "type": "string"
                        },
                        "removed": {
                          "type": "boolean"
                        },
                        "allowed_domains": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "still_covered_by": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/cadence_template.create": {
      "post": {
        "operationId": "call_cadence_template_create",
        "summary": "Call cadence_template.create",
        "description": "'set up a posting rhythm', 'we post three times a week' — create one cadence template in this workspace: the weekly rhythm the schedule plans slots from, written out slot by slot (weekday, time, destination, asset type and piece format). Nothing publishes and nothing is scheduled by it. Leave the slots out to create an empty rhythm. Not for making a rhythm the default — that is `cadence_template.set_default`.\n\nEvery 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.",
        "tags": [
          "cadence_template"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "description": "What to call the rhythm. It must be unique in the workspace — a duplicate is refused, not silently renamed."
                  },
                  "description": {
                    "description": "A sentence on what this rhythm is for.",
                    "type": "string",
                    "maxLength": 500
                  },
                  "slots": {
                    "description": "The weekly slots, in the order they should appear. Leave it out to create an empty rhythm the operator fills in on the Cadence surface.",
                    "maxItems": 40,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "day_of_week": {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 6,
                          "description": "Which weekday this slot publishes on, 0 = Monday through 6 = Sunday."
                        },
                        "time_of_day": {
                          "type": "string",
                          "pattern": "^([01]\\d|2[0-3]):[0-5]\\d(:[0-5]\\d)?$",
                          "description": "The wall-clock time this slot publishes at, HH:MM (24-hour). It is workspace-local, not UTC."
                        },
                        "destination": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 120,
                          "description": "Where this slot publishes — the destination key."
                        },
                        "required_asset_type": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 120,
                          "description": "What kind of asset this slot expects."
                        },
                        "piece_format": {
                          "type": "string",
                          "enum": [
                            "posts",
                            "stories",
                            "shorts_clips",
                            "long_form",
                            "articles",
                            "podcast"
                          ],
                          "description": "What kind of content this slot publishes. Required — a slot with no format is invisible to every rhythm view, so the rhythm would run and plan nothing. Pick the one the member described: posts for a social post, stories for a story, shorts_clips for a short vertical video, long_form for a full-length video, articles for a written article, podcast for an audio episode."
                        },
                        "approval_required": {
                          "description": "Whether a person must approve before this slot publishes.",
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "day_of_week",
                        "time_of_day",
                        "destination",
                        "required_asset_type",
                        "piece_format"
                      ],
                      "description": "One weekly slot in the rhythm.",
                      "additionalProperties": false
                    }
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "name"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "template_id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "slot_count": {
                          "type": "number"
                        },
                        "is_default": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "is_default",
                        "name",
                        "slot_count",
                        "template_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/cadence_template.set_default": {
      "post": {
        "operationId": "call_cadence_template_set_default",
        "summary": "Call cadence_template.set_default",
        "description": "'use that rhythm from now on', 'make this our default pattern' — make one of this workspace's cadence templates, named by its template_id, the rhythm new weeks are planned from. Whichever rhythm was the default stops being it; a workspace has exactly one. Not for creating a rhythm — that is `cadence_template.create`.\n\nEvery 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.",
        "tags": [
          "cadence_template"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "template_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The cadence template to make the workspace default."
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "template_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "template_id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "is_default": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "is_default",
                        "name",
                        "template_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/cadence_template.deactivate": {
      "post": {
        "operationId": "call_cadence_template_deactivate",
        "summary": "Call cadence_template.deactivate",
        "description": "'retire that rhythm', 'we're not using that pattern any more' — retire one of this workspace's cadence templates, named by its template_id, so it stops being offered for new weeks. It is not deleted: weeks already built from it keep working. It answers in two calls: without confirmation_id it proposes, says what would change and changes nothing; the same call again with that confirmation_id, on a member's own API key, retires it. Not for switching the default rhythm — that is `cadence_template.set_default`.\n\nEvery 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.",
        "tags": [
          "cadence_template"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "template_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The cadence template to retire."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "template_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "deactivated"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "template_id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "is_active": {
                          "type": "boolean"
                        },
                        "is_default": {
                          "type": "boolean"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "is_active",
                        "name",
                        "state",
                        "template_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/schedule_slot.cancel": {
      "post": {
        "operationId": "call_schedule_slot_cancel",
        "summary": "Call schedule_slot.cancel",
        "description": "'cancel Thursday's post', 'drop the Friday slot' — cancel one planned schedule slot in this workspace, named by its slot_id, so it will not go out, with the reason recorded on the audit trail. It only changes the plan here: it does not reach the platform or take down anything already published, and cancelling is final. Not for adding a piece to the grid — that is `content.create_request`. 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.\n\nEvery 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.",
        "tags": [
          "schedule_slot"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "slot_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                    "description": "The schedule slot to cancel."
                  },
                  "reason": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 500,
                    "description": "Why it is being cancelled, in the operator's own words. It is required and it is recorded on the audit trail."
                  },
                  "confirmation_id": {
                    "description": "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.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "slot_id",
                  "reason"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "anyOf": [
                            {
                              "type": "string",
                              "const": "confirmation_required"
                            },
                            {
                              "type": "string",
                              "const": "cancelled"
                            }
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "request_summary": {
                          "type": "string",
                          "description": "What will happen, in one sentence, for a person to approve before confirming."
                        },
                        "slot_id": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string"
                        },
                        "publish_at": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/analytics.query_metrics": {
      "post": {
        "operationId": "call_analytics_query_metrics",
        "summary": "Call analytics.query_metrics",
        "description": "'how many visitors did we get last week?', 'what's our conversion rate?' — read this workspace's analytics numbers over a window: the same figures, from the same reads, the analytics pages show. Name dictionary keys (analytics.list_available_metrics lists them) and a preset period or an explicit from/to; set compare to also read the preceding window. Every row carries a state: empty is a final answer, read_failed means nothing is known, and suppressed means a small-count privacy floor withholds the figure. It changes nothing. Not for which metrics exist or report here — that is `analytics.list_available_metrics`.\n\nEvery 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.",
        "tags": [
          "analytics"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "metric_keys": {
                    "minItems": 1,
                    "maxItems": 12,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "rev_leads",
                        "rev_booked_calls",
                        "rev_calls_showed",
                        "rev_show_rate",
                        "rev_sales_won",
                        "rev_revenue_won",
                        "rev_revenue_by_source",
                        "rev_open_pipeline_value",
                        "email_sent",
                        "email_delivered",
                        "email_delivery_rate",
                        "email_opened",
                        "email_open_rate",
                        "email_clicked",
                        "email_click_rate",
                        "email_replied",
                        "email_complaint_rate",
                        "email_bounce_rate",
                        "list_size",
                        "list_new_subscribers",
                        "list_unsubscribe_rate",
                        "ads_spend",
                        "ads_impressions",
                        "ads_clicks",
                        "ads_ctr",
                        "ads_cpc",
                        "ads_cpm",
                        "ads_reach",
                        "ads_frequency",
                        "ads_conversions",
                        "ads_cost_per_lead",
                        "ads_cost_per_booked_call",
                        "ads_attributed_revenue",
                        "vid_views",
                        "vid_watch_time_minutes",
                        "vid_avg_view_duration",
                        "vid_impressions",
                        "vid_impressions_ctr",
                        "vid_subscribers_gained",
                        "vid_net_subscribers",
                        "vid_breakout_score",
                        "soc_posts_published",
                        "soc_impressions",
                        "soc_engagements",
                        "soc_engagement_rate",
                        "soc_meta_impressions",
                        "soc_meta_engagements",
                        "soc_meta_engagement_rate",
                        "soc_fb_impressions",
                        "soc_fb_engagements",
                        "soc_fb_engagement_rate",
                        "soc_ig_impressions",
                        "soc_ig_reach",
                        "soc_ig_engagements",
                        "soc_ig_engagement_rate",
                        "soc_ig_profile_visits",
                        "soc_ig_new_follows",
                        "sys_produced",
                        "hyros_attributed_revenue",
                        "hyros_attributed_leads",
                        "web_sessions",
                        "web_active_users",
                        "web_conversions",
                        "web_revenue",
                        "web_search_impressions",
                        "web_search_clicks",
                        "web_search_ctr",
                        "web_search_position",
                        "site_views",
                        "site_visitors",
                        "site_sessions",
                        "site_conversions",
                        "site_conversion_rate"
                      ]
                    },
                    "description": "Dictionary metric keys to read. Use analytics.list_available_metrics to discover them."
                  },
                  "period": {
                    "description": "The window ending at the start of today (today is excluded), as the span the member names, counted in whole days: 14d for two weeks, 30d for 30 days, 3d for the last three days. Three ids are the analytics page's own presets and read whole COMPLETE periods: 7d = the last 7 complete days, 28d = the last 4 complete weeks, 90d = the last 3 complete calendar months (92 days on a May-Aug read, not 90); use one of them only when the member's span is that one. Any other count, 1d to 366d, reads that many complete days. Omit when supplying from/to, which is for named calendar dates ('in March').",
                    "type": "string",
                    "pattern": "^[1-9][0-9]{0,2}d$"
                  },
                  "from": {
                    "description": "Window start, ISO-8601 date or timestamp. Inclusive. Requires `to`.",
                    "type": "string"
                  },
                  "to": {
                    "description": "Window end, ISO-8601 date or timestamp. EXCLUSIVE.",
                    "type": "string"
                  },
                  "grain": {
                    "description": "Granularity the stored rows are read at. LEAVE THIS UNSET unless you have a specific reason: day is where the analytics store is written, and asking for a coarser grain reads a different set of rows that is usually empty. A window is summed from day rows regardless of how long it is, so a month-long window does NOT need grain=month.",
                    "type": "string",
                    "enum": [
                      "hour",
                      "day",
                      "week",
                      "month",
                      "quarter",
                      "year",
                      "lifetime"
                    ]
                  },
                  "compare": {
                    "description": "Also read the immediately preceding window of the same number of COMPLETE periods, for a like-for-like comparison. On a preset that is a calendar step, so the preceding window holds the same number of weeks or months — not necessarily the same number of days.",
                    "type": "boolean"
                  },
                  "by": {
                    "description": "Split each ad sum (ads_spend, ads_impressions, ads_clicks, ads_conversions) by ad platform — Meta, Google, LinkedIn, TikTok, Snapchat — each with its state: measured (a figure), quiet (connected, nothing ran), unread (we do not read that platform's spend yet) or not_connected. A platform with no figure is never a zero. Other keys come back unsplit. The split is read on a signed-in member's session only: a call made with an API key answers the unsplit figures and a split_note saying so.",
                    "type": "string",
                    "enum": [
                      "platform"
                    ]
                  },
                  "site": {
                    "description": "Narrow site_* metrics to one of the brand's Pages sites, by its name as the member says it, like Riverside Bakery, or by its id. The name is looked up in this workspace, so no `page.list` call is needed first. Add page_path for one page of it; a path (it starts with /) is always page_path, never site. Only with site_* keys.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "site_id": {
                    "description": "The same narrowing as site, by the site's id alone. Only with site_* keys.",
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "page_path": {
                    "description": "Narrow site_* metrics to one page by its path, like /pricing — that path on every site unless site is also given. Only with site_* keys.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 1024,
                    "pattern": "^\\/.*"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "metric_keys"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "window": {
                          "type": "object",
                          "properties": {
                            "from": {
                              "type": "string"
                            },
                            "to": {
                              "type": "string"
                            },
                            "label": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "from",
                            "to",
                            "label"
                          ],
                          "additionalProperties": false
                        },
                        "previous_window": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "from": {
                                  "type": "string"
                                },
                                "to": {
                                  "type": "string"
                                },
                                "label": {
                                  "type": "string"
                                }
                              },
                              "required": [
                                "from",
                                "to",
                                "label"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "grain": {
                          "type": "string"
                        },
                        "definition_version": {
                          "type": "integer"
                        },
                        "min_delta_periods": {
                          "type": "integer"
                        },
                        "metrics": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string"
                              },
                              "label": {
                                "type": "string"
                              },
                              "module": {
                                "type": "string"
                              },
                              "formula": {
                                "type": "string"
                              },
                              "source": {
                                "type": "string"
                              },
                              "provenance": {
                                "type": "string"
                              },
                              "aggregation": {
                                "type": "string"
                              },
                              "definition_version": {
                                "type": "integer"
                              },
                              "is_directional": {
                                "type": "boolean"
                              },
                              "honesty_note": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "floor": {
                                "anyOf": [
                                  {
                                    "type": "object",
                                    "properties": {
                                      "kind": {
                                        "type": "string"
                                      },
                                      "threshold": {
                                        "type": "integer"
                                      }
                                    },
                                    "required": [
                                      "kind",
                                      "threshold"
                                    ],
                                    "additionalProperties": false
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "recompute_required": {
                                "type": "boolean"
                              },
                              "current": {
                                "type": "object",
                                "properties": {
                                  "value": {
                                    "anyOf": [
                                      {
                                        "type": "number"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "display": {
                                    "type": "string"
                                  },
                                  "row_count": {
                                    "type": "integer",
                                    "minimum": 0
                                  },
                                  "currency_code": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "store": {
                                    "type": "string",
                                    "enum": [
                                      "metric_rollups",
                                      "metric_snapshots",
                                      "ad_campaign_metrics",
                                      "page_view_daily",
                                      "none"
                                    ]
                                  },
                                  "suppressed": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  }
                                },
                                "required": [
                                  "value",
                                  "display",
                                  "row_count",
                                  "currency_code",
                                  "store",
                                  "suppressed"
                                ],
                                "additionalProperties": false
                              },
                              "previous": {
                                "anyOf": [
                                  {
                                    "type": "object",
                                    "properties": {
                                      "value": {
                                        "anyOf": [
                                          {
                                            "type": "number"
                                          },
                                          {
                                            "type": "null"
                                          }
                                        ]
                                      },
                                      "display": {
                                        "type": "string"
                                      },
                                      "row_count": {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      "currency_code": {
                                        "anyOf": [
                                          {
                                            "type": "string"
                                          },
                                          {
                                            "type": "null"
                                          }
                                        ]
                                      },
                                      "store": {
                                        "type": "string",
                                        "enum": [
                                          "metric_rollups",
                                          "metric_snapshots",
                                          "ad_campaign_metrics",
                                          "page_view_daily",
                                          "none"
                                        ]
                                      },
                                      "suppressed": {
                                        "anyOf": [
                                          {
                                            "type": "string"
                                          },
                                          {
                                            "type": "null"
                                          }
                                        ]
                                      }
                                    },
                                    "required": [
                                      "value",
                                      "display",
                                      "row_count",
                                      "currency_code",
                                      "store",
                                      "suppressed"
                                    ],
                                    "additionalProperties": false
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "change": {
                                "anyOf": [
                                  {
                                    "type": "object",
                                    "properties": {
                                      "absolute": {
                                        "type": "number"
                                      },
                                      "percent": {
                                        "anyOf": [
                                          {
                                            "type": "number"
                                          },
                                          {
                                            "type": "null"
                                          }
                                        ]
                                      }
                                    },
                                    "required": [
                                      "absolute",
                                      "percent"
                                    ],
                                    "additionalProperties": false
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "change_unavailable": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "state": {
                                "type": "string",
                                "enum": [
                                  "reported",
                                  "empty",
                                  "not_aggregatable",
                                  "suppressed",
                                  "read_failed"
                                ]
                              },
                              "by_platform": {
                                "anyOf": [
                                  {
                                    "type": "array",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "platform": {
                                          "type": "string"
                                        },
                                        "label": {
                                          "type": "string"
                                        },
                                        "state": {
                                          "type": "string",
                                          "enum": [
                                            "measured",
                                            "quiet",
                                            "unread",
                                            "not_connected"
                                          ]
                                        },
                                        "value": {
                                          "anyOf": [
                                            {
                                              "type": "number"
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "display": {
                                          "type": "string"
                                        },
                                        "detail": {
                                          "type": "string"
                                        }
                                      },
                                      "required": [
                                        "platform",
                                        "label",
                                        "state",
                                        "value",
                                        "display",
                                        "detail"
                                      ],
                                      "additionalProperties": false
                                    }
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "key",
                              "label",
                              "module",
                              "formula",
                              "source",
                              "provenance",
                              "aggregation",
                              "definition_version",
                              "is_directional",
                              "honesty_note",
                              "floor",
                              "recompute_required",
                              "current",
                              "previous",
                              "change",
                              "change_unavailable",
                              "state",
                              "by_platform"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "all_empty": {
                          "type": "boolean"
                        },
                        "answer_note": {
                          "type": "string"
                        },
                        "split_note": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "site_filter": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "site_id": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                },
                                "page_path": {
                                  "anyOf": [
                                    {
                                      "type": "string"
                                    },
                                    {
                                      "type": "null"
                                    }
                                  ]
                                }
                              },
                              "required": [
                                "site_id",
                                "page_path"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "all_empty",
                        "answer_note",
                        "definition_version",
                        "grain",
                        "metrics",
                        "min_delta_periods",
                        "previous_window",
                        "site_filter",
                        "split_note",
                        "window",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/analytics.list_available_metrics": {
      "post": {
        "operationId": "call_analytics_list_available_metrics",
        "summary": "Call analytics.list_available_metrics",
        "description": "'what can you measure for us?', 'why is this number empty?' — list the analytics metric dictionary and, for each key, whether anything has ever reported it for this workspace and when it last did. Optionally narrow to one module. It changes nothing. Not for reading a metric's value — that is `analytics.query_metrics`.\n\nEvery 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.",
        "tags": [
          "analytics"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "module": {
                    "description": "Narrow to one reporting module. Omit to list them all.",
                    "type": "string",
                    "enum": [
                      "pipeline",
                      "emails",
                      "ads",
                      "videos",
                      "social",
                      "produced",
                      "web",
                      "site"
                    ]
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "definition_version": {
                          "type": "integer"
                        },
                        "metrics": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string"
                              },
                              "label": {
                                "type": "string"
                              },
                              "module": {
                                "type": "string"
                              },
                              "formula": {
                                "type": "string"
                              },
                              "source": {
                                "type": "string"
                              },
                              "provenance": {
                                "type": "string"
                              },
                              "definition_version": {
                                "type": "integer"
                              },
                              "is_directional": {
                                "type": "boolean"
                              },
                              "honesty_note": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "has_data": {
                                "type": "boolean"
                              },
                              "last_period_start": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "last_grain": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "key",
                              "label",
                              "module",
                              "formula",
                              "source",
                              "provenance",
                              "definition_version",
                              "is_directional",
                              "honesty_note",
                              "has_data",
                              "last_period_start",
                              "last_grain"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "reporting_sources": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "definition_version",
                        "metrics",
                        "reporting_sources",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/analytics.linkedin_page_analytics": {
      "post": {
        "operationId": "call_analytics_linkedin_page_analytics",
        "summary": "Call analytics.linkedin_page_analytics",
        "description": "'how is our LinkedIn page doing?', 'who follows us on LinkedIn?' — read this workspace's LinkedIn company-page statistics over the grant the workspace connected: followers and their demographics, page views and clicks, and organic post engagement, optionally over a window of days. The answer names the source it read; when LinkedIn is reached only through the workspace's CRM connection it says so and returns no LinkedIn figures. It changes nothing. Not for the cross-platform social totals — that is `analytics.query_metrics`.\n\nEvery 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.",
        "tags": [
          "analytics"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "organization_urn": {
                    "description": "The company page to read, as its LinkedIn page URN — the urn:li:… identifier carried on the connected grant. Omit when the connection administers exactly one page — it is then chosen automatically. If several are administered, this is required and the answer lists them.",
                    "type": "string"
                  },
                  "days": {
                    "description": "Read a trailing window of this many days instead of lifetime totals. OMIT for the lifetime read, which is the only one that carries follower DEMOGRAPHICS (industry, seniority, function, geography) — LinkedIn drops every demographic facet from a time-bound follower query, so a window and a breakdown are two different questions.",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 90
                  },
                  "include": {
                    "description": "Which sections to read: followers (count + demographics or gains), page_views (views and custom-button clicks), shares (organic impressions, clicks, reactions, comments, engagement rate). Omit for all three. Each section is a separate LinkedIn call, so narrowing this spends less of the page's rate budget.",
                    "minItems": 1,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "followers",
                        "page_views",
                        "shares"
                      ]
                    }
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "source": {
                          "type": "string",
                          "enum": [
                            "linkedin_cmapi",
                            "ghl",
                            "none"
                          ],
                          "description": "Which rail these numbers came from. linkedin_cmapi = LinkedIn's own page analytics; ghl = the workspace posts through GoHighLevel, which reports no LinkedIn-specific numbers; none = neither is connected."
                        },
                        "provenance": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "platform_reported"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "The trust class, on the metric dictionary's own axis. Both connected rails are platform_reported — the platform's number, subject to the platform's methodology. Null when there is no number."
                        },
                        "source_note": {
                          "type": "string",
                          "description": "The plain-language sentence to tell the operator about where these numbers come from. Say it — never paraphrase it into a stronger claim."
                        },
                        "connect_path": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Where the operator connects LinkedIn page analytics directly, when that would change the answer. Null when already connected on the direct rail."
                        },
                        "read_elsewhere": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "metric_keys": {
                                  "type": "array",
                                  "items": {
                                    "type": "string"
                                  }
                                },
                                "tool": {
                                  "type": "string"
                                },
                                "path": {
                                  "type": "string"
                                }
                              },
                              "required": [
                                "metric_keys",
                                "tool",
                                "path"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "On the ghl source ONLY: the cross-platform social metric keys LinkedIn activity is counted inside, and the tool/page that reads them. There is no LinkedIn breakdown to give — offer these instead of guessing one."
                        },
                        "organization_urn": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "The company page these numbers are for. Null on the ghl and none sources, which have no page-level read."
                        },
                        "administered_organizations": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          },
                          "description": "Every company page this connection may read. More than one and organization_urn is required."
                        },
                        "window": {
                          "type": "object",
                          "properties": {
                            "kind": {
                              "type": "string",
                              "enum": [
                                "lifetime",
                                "time_bound"
                              ],
                              "description": "lifetime = no time restriction, and the ONLY kind that carries follower demographics. time_bound = a trailing window."
                            },
                            "days": {
                              "anyOf": [
                                {
                                  "type": "number"
                                },
                                {
                                  "type": "null"
                                }
                              ],
                              "description": "The window length asked for. Null on a lifetime read."
                            },
                            "granularity": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "enum": [
                                    "DAY",
                                    "MONTH"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ],
                              "description": "The interval each row covers. Null on a lifetime read. LinkedIn's page statistics accept DAY or MONTH only."
                            },
                            "follower_window_ends_days_ago": {
                              "anyOf": [
                                {
                                  "type": "number"
                                },
                                {
                                  "type": "null"
                                }
                              ],
                              "description": "LinkedIn publishes time-bound follower data only up to this many days before today, so the follower series legitimately stops short of the rest of the window. Null when no follower series was read."
                            },
                            "follower_start_ms": {
                              "anyOf": [
                                {
                                  "type": "number"
                                },
                                {
                                  "type": "null"
                                }
                              ],
                              "description": "The ACTUAL start of the follower interval sent to LinkedIn, epoch ms. Report this rather than inferring it from `days` — the two differ whenever the publication lag applies."
                            },
                            "follower_end_ms": {
                              "anyOf": [
                                {
                                  "type": "number"
                                },
                                {
                                  "type": "null"
                                }
                              ],
                              "description": "The ACTUAL end of the follower interval sent to LinkedIn, epoch ms. Null when no follower series was read."
                            }
                          },
                          "required": [
                            "kind",
                            "days",
                            "granularity",
                            "follower_window_ends_days_ago",
                            "follower_start_ms",
                            "follower_end_ms"
                          ],
                          "description": "What was ACTUALLY read — not what was asked for. The two differ whenever LinkedIn's follower publication lag applies.",
                          "additionalProperties": false
                        },
                        "total_followers": {
                          "anyOf": [
                            {
                              "type": "number"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "The page's total follower count, from LinkedIn's networkSizes read. It is a SEPARATE call from the follower statistics and carries no publication lag. Null when the followers section was not read or its call failed."
                        },
                        "follower_demographics": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "by_association_type": {
                                  "type": "object",
                                  "properties": {
                                    "buckets": {
                                      "type": "array",
                                      "items": {
                                        "type": "object",
                                        "properties": {
                                          "key": {
                                            "type": "string",
                                            "description": "The facet value — a LinkedIn URN or enum, e.g. urn:li:industry:4."
                                          },
                                          "follower_count": {
                                            "type": "number",
                                            "description": "Organic AND paid followers in this bucket, rolled together."
                                          }
                                        },
                                        "required": [
                                          "key",
                                          "follower_count"
                                        ],
                                        "additionalProperties": false
                                      },
                                      "description": "The most-followed buckets, descending."
                                    },
                                    "total_buckets": {
                                      "type": "number",
                                      "description": "How many buckets LinkedIn returned for this facet in total."
                                    },
                                    "truncated": {
                                      "type": "boolean",
                                      "description": "True when buckets is a SUBSET. Never describe a truncated facet as the complete breakdown."
                                    }
                                  },
                                  "required": [
                                    "buckets",
                                    "total_buckets",
                                    "truncated"
                                  ],
                                  "additionalProperties": false
                                },
                                "by_country": {
                                  "type": "object",
                                  "properties": {
                                    "buckets": {
                                      "type": "array",
                                      "items": {
                                        "type": "object",
                                        "properties": {
                                          "key": {
                                            "type": "string",
                                            "description": "The facet value — a LinkedIn URN or enum, e.g. urn:li:industry:4."
                                          },
                                          "follower_count": {
                                            "type": "number",
                                            "description": "Organic AND paid followers in this bucket, rolled together."
                                          }
                                        },
                                        "required": [
                                          "key",
                                          "follower_count"
                                        ],
                                        "additionalProperties": false
                                      },
                                      "description": "The most-followed buckets, descending."
                                    },
                                    "total_buckets": {
                                      "type": "number",
                                      "description": "How many buckets LinkedIn returned for this facet in total."
                                    },
                                    "truncated": {
                                      "type": "boolean",
                                      "description": "True when buckets is a SUBSET. Never describe a truncated facet as the complete breakdown."
                                    }
                                  },
                                  "required": [
                                    "buckets",
                                    "total_buckets",
                                    "truncated"
                                  ],
                                  "additionalProperties": false
                                },
                                "by_function": {
                                  "type": "object",
                                  "properties": {
                                    "buckets": {
                                      "type": "array",
                                      "items": {
                                        "type": "object",
                                        "properties": {
                                          "key": {
                                            "type": "string",
                                            "description": "The facet value — a LinkedIn URN or enum, e.g. urn:li:industry:4."
                                          },
                                          "follower_count": {
                                            "type": "number",
                                            "description": "Organic AND paid followers in this bucket, rolled together."
                                          }
                                        },
                                        "required": [
                                          "key",
                                          "follower_count"
                                        ],
                                        "additionalProperties": false
                                      },
                                      "description": "The most-followed buckets, descending."
                                    },
                                    "total_buckets": {
                                      "type": "number",
                                      "description": "How many buckets LinkedIn returned for this facet in total."
                                    },
                                    "truncated": {
                                      "type": "boolean",
                                      "description": "True when buckets is a SUBSET. Never describe a truncated facet as the complete breakdown."
                                    }
                                  },
                                  "required": [
                                    "buckets",
                                    "total_buckets",
                                    "truncated"
                                  ],
                                  "additionalProperties": false
                                },
                                "by_industry": {
                                  "type": "object",
                                  "properties": {
                                    "buckets": {
                                      "type": "array",
                                      "items": {
                                        "type": "object",
                                        "properties": {
                                          "key": {
                                            "type": "string",
                                            "description": "The facet value — a LinkedIn URN or enum, e.g. urn:li:industry:4."
                                          },
                                          "follower_count": {
                                            "type": "number",
                                            "description": "Organic AND paid followers in this bucket, rolled together."
                                          }
                                        },
                                        "required": [
                                          "key",
                                          "follower_count"
                                        ],
                                        "additionalProperties": false
                                      },
                                      "description": "The most-followed buckets, descending."
                                    },
                                    "total_buckets": {
                                      "type": "number",
                                      "description": "How many buckets LinkedIn returned for this facet in total."
                                    },
                                    "truncated": {
                                      "type": "boolean",
                                      "description": "True when buckets is a SUBSET. Never describe a truncated facet as the complete breakdown."
                                    }
                                  },
                                  "required": [
                                    "buckets",
                                    "total_buckets",
                                    "truncated"
                                  ],
                                  "additionalProperties": false
                                },
                                "by_geo": {
                                  "type": "object",
                                  "properties": {
                                    "buckets": {
                                      "type": "array",
                                      "items": {
                                        "type": "object",
                                        "properties": {
                                          "key": {
                                            "type": "string",
                                            "description": "The facet value — a LinkedIn URN or enum, e.g. urn:li:industry:4."
                                          },
                                          "follower_count": {
                                            "type": "number",
                                            "description": "Organic AND paid followers in this bucket, rolled together."
                                          }
                                        },
                                        "required": [
                                          "key",
                                          "follower_count"
                                        ],
                                        "additionalProperties": false
                                      },
                                      "description": "The most-followed buckets, descending."
                                    },
                                    "total_buckets": {
                                      "type": "number",
                                      "description": "How many buckets LinkedIn returned for this facet in total."
                                    },
                                    "truncated": {
                                      "type": "boolean",
                                      "description": "True when buckets is a SUBSET. Never describe a truncated facet as the complete breakdown."
                                    }
                                  },
                                  "required": [
                                    "buckets",
                                    "total_buckets",
                                    "truncated"
                                  ],
                                  "additionalProperties": false
                                },
                                "by_seniority": {
                                  "type": "object",
                                  "properties": {
                                    "buckets": {
                                      "type": "array",
                                      "items": {
                                        "type": "object",
                                        "properties": {
                                          "key": {
                                            "type": "string",
                                            "description": "The facet value — a LinkedIn URN or enum, e.g. urn:li:industry:4."
                                          },
                                          "follower_count": {
                                            "type": "number",
                                            "description": "Organic AND paid followers in this bucket, rolled together."
                                          }
                                        },
                                        "required": [
                                          "key",
                                          "follower_count"
                                        ],
                                        "additionalProperties": false
                                      },
                                      "description": "The most-followed buckets, descending."
                                    },
                                    "total_buckets": {
                                      "type": "number",
                                      "description": "How many buckets LinkedIn returned for this facet in total."
                                    },
                                    "truncated": {
                                      "type": "boolean",
                                      "description": "True when buckets is a SUBSET. Never describe a truncated facet as the complete breakdown."
                                    }
                                  },
                                  "required": [
                                    "buckets",
                                    "total_buckets",
                                    "truncated"
                                  ],
                                  "additionalProperties": false
                                },
                                "by_staff_count_range": {
                                  "type": "object",
                                  "properties": {
                                    "buckets": {
                                      "type": "array",
                                      "items": {
                                        "type": "object",
                                        "properties": {
                                          "key": {
                                            "type": "string",
                                            "description": "The facet value — a LinkedIn URN or enum, e.g. urn:li:industry:4."
                                          },
                                          "follower_count": {
                                            "type": "number",
                                            "description": "Organic AND paid followers in this bucket, rolled together."
                                          }
                                        },
                                        "required": [
                                          "key",
                                          "follower_count"
                                        ],
                                        "additionalProperties": false
                                      },
                                      "description": "The most-followed buckets, descending."
                                    },
                                    "total_buckets": {
                                      "type": "number",
                                      "description": "How many buckets LinkedIn returned for this facet in total."
                                    },
                                    "truncated": {
                                      "type": "boolean",
                                      "description": "True when buckets is a SUBSET. Never describe a truncated facet as the complete breakdown."
                                    }
                                  },
                                  "required": [
                                    "buckets",
                                    "total_buckets",
                                    "truncated"
                                  ],
                                  "additionalProperties": false
                                }
                              },
                              "required": [
                                "by_association_type",
                                "by_country",
                                "by_function",
                                "by_industry",
                                "by_geo",
                                "by_seniority",
                                "by_staff_count_range"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Lifetime read only. Bucket keys are LinkedIn URNs or enums, and each count rolls organic AND paid followers together — LinkedIn's own instruction, not an approximation. Each facet reports its FULL bucket count alongside the top few it carries; see `truncated`."
                        },
                        "follower_gains": {
                          "anyOf": [
                            {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "start_ms": {
                                    "type": "number"
                                  },
                                  "end_ms": {
                                    "type": "number"
                                  },
                                  "organic_follower_gain": {
                                    "type": "number"
                                  },
                                  "paid_follower_gain": {
                                    "type": "number"
                                  }
                                },
                                "required": [
                                  "start_ms",
                                  "end_ms",
                                  "organic_follower_gain",
                                  "paid_follower_gain"
                                ],
                                "additionalProperties": false
                              }
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Time-bound read only. GAINS per interval, not running totals."
                        },
                        "page_views": {
                          "anyOf": [
                            {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "start_ms": {
                                    "anyOf": [
                                      {
                                        "type": "number"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "end_ms": {
                                    "anyOf": [
                                      {
                                        "type": "number"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "all_page_views": {
                                    "type": "number"
                                  },
                                  "all_desktop_page_views": {
                                    "type": "number"
                                  },
                                  "all_mobile_page_views": {
                                    "type": "number"
                                  },
                                  "overview_page_views": {
                                    "type": "number"
                                  },
                                  "custom_button_clicks": {
                                    "type": "number"
                                  }
                                },
                                "required": [
                                  "start_ms",
                                  "end_ms",
                                  "all_page_views",
                                  "all_desktop_page_views",
                                  "all_mobile_page_views",
                                  "overview_page_views",
                                  "custom_button_clicks"
                                ],
                                "additionalProperties": false
                              }
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "all_page_views counts every page tab across desktop and mobile; overview_page_views counts the overview tab only, so all_* is legitimately the larger number."
                        },
                        "shares": {
                          "anyOf": [
                            {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "start_ms": {
                                    "anyOf": [
                                      {
                                        "type": "number"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "end_ms": {
                                    "anyOf": [
                                      {
                                        "type": "number"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "impression_count": {
                                    "type": "number"
                                  },
                                  "unique_impressions_count": {
                                    "type": "number"
                                  },
                                  "click_count": {
                                    "type": "number"
                                  },
                                  "like_count": {
                                    "type": "number"
                                  },
                                  "comment_count": {
                                    "type": "number"
                                  },
                                  "share_count": {
                                    "type": "number"
                                  },
                                  "engagement": {
                                    "type": "number"
                                  }
                                },
                                "required": [
                                  "start_ms",
                                  "end_ms",
                                  "impression_count",
                                  "unique_impressions_count",
                                  "click_count",
                                  "like_count",
                                  "comment_count",
                                  "share_count",
                                  "engagement"
                                ],
                                "additionalProperties": false
                              }
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "ORGANIC only — sponsored activity is not counted here and lives on the ads rail. like_count can be negative when a member unlikes a sponsored share; that is LinkedIn's number, not a bug."
                        },
                        "unavailable": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "section": {
                                "type": "string"
                              },
                              "reason": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "section",
                              "reason"
                            ],
                            "additionalProperties": false
                          },
                          "description": "Sections that were asked for and could not be read, each with why. A section listed here has NO number — never report it as zero."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "administered_organizations",
                        "connect_path",
                        "follower_demographics",
                        "follower_gains",
                        "organization_urn",
                        "page_views",
                        "provenance",
                        "read_elsewhere",
                        "shares",
                        "source",
                        "source_note",
                        "total_followers",
                        "unavailable",
                        "window",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.videos": {
      "post": {
        "operationId": "call_page_videos",
        "summary": "Call page.videos",
        "description": "List the videos a page plays and the workspace videos it could play, each with whether it is ready, and the finished videos made in Goosy that could go on it — 'which videos are on the landing page?', 'is my upload ready to play yet?'. Attached ones carry the player address a page embeds; a template's video shows as source template; an approved video made in Goosy that is not hosted yet is listed under finished by its title, with the video_id `page.api_video_attach` takes. It reads only. Not for putting a video on the page — that is `page.api_video_attach`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "site_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "videos": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "video_id": {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                              },
                              "source": {
                                "type": "string",
                                "enum": [
                                  "workspace",
                                  "template"
                                ]
                              },
                              "attached": {
                                "type": "boolean"
                              },
                              "attachment_id": {
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "format": "uuid",
                                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "state": {
                                "type": "string",
                                "enum": [
                                  "stored",
                                  "pushing",
                                  "processing",
                                  "ready",
                                  "grace",
                                  "failed"
                                ]
                              },
                              "title": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "duration_seconds": {
                                "anyOf": [
                                  {
                                    "type": "number"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "captions": {
                                "type": "object",
                                "properties": {
                                  "opted_in": {
                                    "type": "boolean"
                                  },
                                  "languages": {
                                    "type": "array",
                                    "items": {
                                      "type": "string"
                                    }
                                  }
                                },
                                "required": [
                                  "opted_in",
                                  "languages"
                                ],
                                "additionalProperties": false
                              },
                              "poster": {
                                "type": "null"
                              },
                              "player_src": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            },
                            "required": [
                              "video_id",
                              "source",
                              "attached",
                              "attachment_id",
                              "state",
                              "title",
                              "duration_seconds",
                              "captions",
                              "poster",
                              "player_src"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "finished": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "video_id": {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                              },
                              "title": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "video_id",
                              "title"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "finished",
                        "site_id",
                        "videos",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.video_attach": {
      "post": {
        "operationId": "call_page_video_attach",
        "summary": "Call page.video_attach",
        "description": "Put a video on a page so the page can play it — 'add my product video to the landing page', 'put the video we just approved on my homepage'. Name the video by its video_id from page.videos: one of the workspace's videos, or a finished video made in Goosy, which is hosted from its approved cut; while that file is still being prepared it answers copying, and the same call made again attaches it. A video with no approved cut yet is refused by name. Attaching a video that is not yet hosted starts hosting it, which charges the workspace for encoding, and captions are charged only when named. On a key with no member behind it the first call returns a confirmation id and the second, carrying it back, attaches. Not for taking a video off — that is `page.api_video_detach`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "video_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "captions": {
                    "type": "object",
                    "properties": {
                      "languages": {
                        "minItems": 1,
                        "maxItems": 20,
                        "type": "array",
                        "items": {
                          "type": "string",
                          "minLength": 2,
                          "maxLength": 35
                        },
                        "description": "Caption languages as short tags, like en or pt-BR."
                      }
                    },
                    "required": [
                      "languages"
                    ],
                    "additionalProperties": false
                  },
                  "replace_attachment_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "confirmation_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "site_id",
                  "video_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "attached",
                            "copying"
                          ]
                        },
                        "site_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "attachment_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "video_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "source": {
                          "type": "string",
                          "enum": [
                            "workspace",
                            "template"
                          ]
                        },
                        "video_state": {
                          "type": "string",
                          "enum": [
                            "stored",
                            "pushing",
                            "processing",
                            "ready",
                            "grace",
                            "failed"
                          ]
                        },
                        "copy_started": {
                          "type": "boolean"
                        },
                        "encode_bills_again": {
                          "type": "boolean"
                        },
                        "player_src": {
                          "type": "string"
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "site_id",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.video_detach": {
      "post": {
        "operationId": "call_page_video_detach",
        "summary": "Call page.video_detach",
        "description": "Take a video off a page — 'remove the old video from the landing page', 'stop this site playing that clip'. It refuses by name while the live version of the page still plays the video, so remove it from the page and publish first. When no page plays the video any more its hosting ends after a grace window and the original stays in the workspace. On a key with no member behind it the first call returns a confirmation id and the second, carrying it back, detaches. Not for putting a video on — that is `page.api_video_attach`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "attachment_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "confirmation_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "attachment_id"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "detached"
                          ]
                        },
                        "attachment_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "detached_at": {
                          "type": "string"
                        },
                        "last_attachment": {
                          "type": "boolean"
                        },
                        "hosting_ends_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "attachment_id",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.video_upload": {
      "post": {
        "operationId": "call_page_video_upload",
        "summary": "Call page.video_upload",
        "description": "Bring a video file of the customer's own into the workspace so a page can play it — 'upload our demo video', 'port this mp4 to the site'. Start with the file's name, type and size; the answer is one upload address, or parts to request with sign_parts and send in order; complete records the video, and abort abandons it. The video is stored and never hosted until it is attached to a page; storage is charged per month. On a key with no member behind it, start returns a confirmation_id first, and so does a complete that names captions, because captions are charged per language minute; calling the same action again with that confirmation_id runs the recorded request, and a confirmed complete stores exactly the caption languages it recorded. Not for putting the finished video on a page — that is `page.api_video_attach`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "action": {
                    "type": "string",
                    "enum": [
                      "start",
                      "sign_parts",
                      "complete",
                      "abort"
                    ]
                  },
                  "filename": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 255
                  },
                  "mime_type": {
                    "type": "string",
                    "minLength": 1
                  },
                  "byte_size": {
                    "type": "integer",
                    "exclusiveMinimum": 0
                  },
                  "upload_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "part_numbers": {
                    "minItems": 1,
                    "type": "array",
                    "items": {
                      "type": "integer",
                      "minimum": 1
                    }
                  },
                  "parts": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "part_number": {
                          "type": "integer",
                          "minimum": 1
                        },
                        "etag": {
                          "type": "string",
                          "minLength": 1
                        }
                      },
                      "required": [
                        "part_number",
                        "etag"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "title": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "captions": {
                    "type": "object",
                    "properties": {
                      "languages": {
                        "minItems": 1,
                        "maxItems": 20,
                        "type": "array",
                        "items": {
                          "type": "string",
                          "minLength": 2,
                          "maxLength": 35
                        },
                        "description": "Caption languages as short tags, like en or pt-BR."
                      }
                    },
                    "required": [
                      "languages"
                    ],
                    "additionalProperties": false
                  },
                  "confirmation_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "action"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "action": {
                          "type": "string",
                          "enum": [
                            "start",
                            "sign_parts",
                            "complete",
                            "abort"
                          ]
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "open",
                            "signed",
                            "stored",
                            "abandoned"
                          ]
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "upload_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "mode": {
                          "type": "string",
                          "enum": [
                            "single",
                            "multipart"
                          ]
                        },
                        "part_size_bytes": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "part_count": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "put_url": {
                          "type": "string"
                        },
                        "part_urls": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "part_number": {
                                "type": "integer"
                              },
                              "put_url": {
                                "type": "string"
                              }
                            },
                            "required": [
                              "part_number",
                              "put_url"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "urls_expire_at": {
                          "type": "string"
                        },
                        "video_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "title": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "action",
                        "state",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page.video_captions": {
      "post": {
        "operationId": "call_page_video_captions",
        "summary": "Call page.video_captions",
        "description": "Turn on captions for a video a page plays, in the languages named — 'add English captions to the launch video', 'caption this in Spanish too'. Captions are off until this is called; each language is charged per minute of video, once, when the captions are ready. Only the workspace's own videos can be captioned, not a template's. On a key with no member behind it the first call returns a confirmation id and the second, carrying it back, opts in. Not for putting the video on the page — that is `page.api_video_attach`.\n\nEvery 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.",
        "tags": [
          "page"
        ],
        "parameters": [
          {
            "name": "x-request-id",
            "in": "header",
            "required": false,
            "description": "Your own id for this request, echoed back and recorded on the audit trail. 1–128 characters from `A–Z a–z 0–9 . _ : -`, starting with a letter or digit; anything else is replaced by a generated id.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "site_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "video_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "languages": {
                    "minItems": 1,
                    "maxItems": 20,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 2,
                      "maxLength": 35
                    },
                    "description": "Caption languages as short tags, like en or pt-BR."
                  },
                  "confirmation_id": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                  },
                  "workspace": {
                    "description": "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.",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "site_id",
                  "video_id",
                  "languages"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "confirmation_required",
                            "opted_in"
                          ]
                        },
                        "video_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "confirmation_id": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "expires_in_seconds": {
                          "type": "integer",
                          "exclusiveMinimum": 0
                        },
                        "languages": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "transcription_started": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "state",
                        "video_id",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/pages/{siteId}/preview-links": {
      "post": {
        "operationId": "createPagePreviewLink",
        "summary": "Create a Pages preview link",
        "description": "Creates a time-limited preview link for a site in the API key's workspace. Omit `ttlMinutes` for 4320 minutes; allowed whole-minute values are 5 through 4320. This REST-only endpoint has no MCP-tool equivalent. The returned token is a bearer capability and must be handled as a secret.",
        "tags": [
          "pages"
        ],
        "parameters": [
          {
            "name": "siteId",
            "in": "path",
            "required": true,
            "description": "The UUID of a site in the API key's workspace.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "ttlMinutes": {
                    "type": "integer",
                    "minimum": 5,
                    "maximum": 4320
                  },
                  "workspace": {
                    "type": "string",
                    "minLength": 1
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The request succeeded. Read the `data` Result field.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; preview tokens and their outcome are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`; a preview token must not be sent in a referrer header.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "const": true
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "siteId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "revision": {
                          "type": "string",
                          "minLength": 1
                        },
                        "url": {
                          "type": "string",
                          "format": "uri"
                        },
                        "token": {
                          "type": "string",
                          "pattern": "^[A-Za-z0-9_-]{43}$"
                        },
                        "expiresAt": {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                        }
                      },
                      "required": [
                        "siteId",
                        "revision",
                        "url",
                        "token",
                        "expiresAt"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "ok",
                    "data"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "The site id or JSON request body did not match the endpoint's strict schema.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; preview tokens and their outcome are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`; a preview token must not be sent in a referrer header.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagePreviewLinkError"
                }
              }
            }
          },
          "401": {
            "description": "No bearer credential, or one that did not resolve.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; preview tokens and their outcome are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`; a preview token must not be sent in a referrer header.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagePreviewLinkError"
                }
              }
            }
          },
          "403": {
            "description": "Programmatic access is unavailable to this holder, the named workspace is outside the key's scope, or the holder lacks `pages.manage` there. `workspace_ambiguous` and `workspace_unreachable` also answer here, and the slugs this key may pass are appended to `error.message`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; preview tokens and their outcome are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`; a preview token must not be sent in a referrer header.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagePreviewLinkError"
                }
              }
            }
          },
          "404": {
            "description": "The site is not in the API key's workspace.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; preview tokens and their outcome are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`; a preview token must not be sent in a referrer header.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagePreviewLinkError"
                }
              }
            }
          },
          "409": {
            "description": "The site has no previewable revision.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; preview tokens and their outcome are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`; a preview token must not be sent in a referrer header.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagePreviewLinkError"
                }
              }
            }
          },
          "429": {
            "description": "The API key is over its rate limit. Wait for `Retry-After` before retrying.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; preview tokens and their outcome are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`; a preview token must not be sent in a referrer header.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagePreviewLinkError"
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server error occurred while handling the request.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; preview tokens and their outcome are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`; a preview token must not be sent in a referrer header.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagePreviewLinkError"
                }
              }
            }
          },
          "503": {
            "description": "Preview hosting is temporarily unavailable in this environment.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; preview tokens and their outcome are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`; a preview token must not be sent in a referrer header.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagePreviewLinkError"
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "revokePagePreviewLink",
        "summary": "Revoke a Pages preview link",
        "description": "Revokes a preview token for a site in the API key's workspace. This REST-only endpoint has no MCP-tool equivalent; the token belongs only in the JSON body.",
        "tags": [
          "pages"
        ],
        "parameters": [
          {
            "name": "siteId",
            "in": "path",
            "required": true,
            "description": "The UUID of a site in the API key's workspace.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "token": {
                    "type": "string",
                    "pattern": "^[A-Za-z0-9_-]{43}$"
                  },
                  "workspace": {
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "token"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The request succeeded. Read the `data` Result field.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; preview tokens and their outcome are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`; a preview token must not be sent in a referrer header.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "const": true
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "siteId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        }
                      },
                      "required": [
                        "siteId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "ok",
                    "data"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "The site id or JSON request body did not match the endpoint's strict schema.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; preview tokens and their outcome are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`; a preview token must not be sent in a referrer header.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagePreviewLinkError"
                }
              }
            }
          },
          "401": {
            "description": "No bearer credential, or one that did not resolve.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; preview tokens and their outcome are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`; a preview token must not be sent in a referrer header.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagePreviewLinkError"
                }
              }
            }
          },
          "403": {
            "description": "Programmatic access is unavailable to this holder, the named workspace is outside the key's scope, or the holder lacks `pages.manage` there. `workspace_ambiguous` and `workspace_unreachable` also answer here, and the slugs this key may pass are appended to `error.message`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; preview tokens and their outcome are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`; a preview token must not be sent in a referrer header.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagePreviewLinkError"
                }
              }
            }
          },
          "429": {
            "description": "The API key is over its rate limit. Wait for `Retry-After` before retrying.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; preview tokens and their outcome are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`; a preview token must not be sent in a referrer header.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagePreviewLinkError"
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server error occurred while handling the request.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; preview tokens and their outcome are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`; a preview token must not be sent in a referrer header.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagePreviewLinkError"
                }
              }
            }
          }
        }
      }
    },
    "/api/pages/{siteId}/assets": {
      "post": {
        "operationId": "uploadPageAsset",
        "summary": "Upload a Pages reference image",
        "description": "Uploads one reference image to the canonical board for a site in the resolved workspace. This REST-only endpoint has no MCP-tool equivalent. The request cannot select a tenant or a board, and `workspace` SELECTS among the workspaces the key's holder already reaches — it never widens a key.",
        "tags": [
          "pages"
        ],
        "parameters": [
          {
            "name": "siteId",
            "in": "path",
            "required": true,
            "description": "The UUID of a site in the resolved workspace.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
            }
          },
          {
            "name": "workspace",
            "in": "query",
            "required": false,
            "description": "Which workspace to act in — its slug or id. The SAME argument every workspace-scoped tool takes, resolved the same way: an account-wide key may select any workspace its holder currently reaches, a workspace-pinned key may only name its own, and a call that names nothing falls through to your default. It is a QUERY parameter rather than a body field on purpose: this endpoint's body is a multipart upload, and reading a field out of it would decode that body before the bearer and the rate limiter had run.",
            "schema": {
              "type": "string",
              "minLength": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "file": {
                    "type": "string",
                    "format": "binary",
                    "description": "The single image file to attach to the site board."
                  }
                },
                "required": [
                  "file"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The image was stored and attached to the site's board.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; upload results are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "const": true
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "boardItemId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "storageObjectId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "displayName": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "boardItemId",
                        "storageObjectId",
                        "displayName"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "ok",
                    "data"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "The site id or multipart request was invalid, or the file failed the image upload limits.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; upload results are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageAssetError"
                }
              }
            }
          },
          "401": {
            "description": "No bearer credential, or one that did not resolve.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; upload results are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageAssetError"
                }
              }
            }
          },
          "403": {
            "description": "Programmatic access is unavailable to this holder, the named workspace is outside the key's scope, or the holder lacks the operator role or `pages.manage` there. `workspace_ambiguous` and `workspace_unreachable` also answer here, and the slugs this key may pass are appended to `error.message`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; upload results are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageAssetError"
                }
              }
            }
          },
          "404": {
            "description": "The site or its canonical board is not in the API key's workspace.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; upload results are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageAssetError"
                }
              }
            }
          },
          "429": {
            "description": "The API key is over its rate limit. Wait for `Retry-After` before retrying.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; upload results are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageAssetError"
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server or storage error occurred while handling the upload.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Cache-Control": {
                "description": "Always `no-store`; upload results are never cacheable.",
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Referrer-Policy": {
                "description": "Always `no-referrer`.",
                "schema": {
                  "type": "string",
                  "const": "no-referrer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageAssetError"
                }
              }
            }
          }
        }
      }
    },
    "/api/pages/ingest": {
      "post": {
        "operationId": "ingestPageArchive",
        "summary": "Import or replace a site from an archive",
        "description": "Uploads one ZIP archive and either creates a site or replaces the code of an existing one. The service classifies the archive from its CONTENTS — a prebuilt bundle is staged immediately, a supported source project is queued for the build rail — and validates any `pages.deploy.json` it carries against the published `PagesDeployManifest` schema, returning the manifest it resolved on every success. The archive must be no larger than 41943040 bytes.\n\n**A push onto a site that already holds a code project shows the diff first.** With `siteId` set and a current project on that site, the call answers `202` with `data.outcome: \"pending_confirmation\"`, the diff against the current project and a `handle` — nothing is written. Send the SAME archive again with `?confirm=<handle>` to apply it (`200`, `outcome: \"ingested\"`). Byte-identical bytes answer `200` with `outcome: \"unchanged\"` and write nothing — and where the site's stored source had no build that came up, that same answer carries a `buildRunId`, because re-pushing an unbuilt project queues its build rather than leaving the site dark. Once such a project has spent the rail's build attempts, the answer stays `200` `unchanged` and carries `buildBlocked` instead: re-pushing an identical archive is never an error, so an idempotent deploy stays green, and the field is where a person is told that only a changed file will build. A first upload proceeds directly. The replaced set is the code project only: the site's database, its storage, its media and its data tables are never touched by a push.",
        "tags": [
          "pages"
        ],
        "parameters": [
          {
            "name": "workspace",
            "in": "query",
            "required": false,
            "description": "Which workspace to act in — its slug or id. The SAME argument every workspace-scoped tool takes, resolved the same way: an account-wide key may select any workspace its holder currently reaches, a workspace-pinned key may only name its own, and a call that names nothing falls through to your default. It is a QUERY parameter rather than a body field on purpose: this endpoint's body is a multipart upload, and reading a field out of it would decode that body before the bearer and the rate limiter had run. With more than one reachable workspace and no default, the call is refused as `workspace_ambiguous` and the choices are listed. Ignored for a signed-in session, whose workspace comes from its own claims.",
            "schema": {
              "type": "string",
              "minLength": 1
            }
          },
          {
            "name": "confirm",
            "in": "query",
            "required": false,
            "description": "The `handle` a previous `202` answered with. Present ⇒ apply the diff that handle was issued for: the archive must be byte-identical to the one the diff was shown for, and the site's current project must still be the base it was shown against, else `400` (`confirmation_stale`). Ignored on a first upload.",
            "schema": {
              "type": "string",
              "minLength": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "file": {
                    "type": "string",
                    "format": "binary",
                    "description": "The single ZIP archive to import."
                  },
                  "siteId": {
                    "type": "string",
                    "format": "uuid",
                    "description": "Replace the source or staged bundle on this existing site. Omit to create one."
                  },
                  "name": {
                    "type": "string",
                    "description": "Display name for a NEWLY created site. Ignored when `siteId` is sent."
                  }
                },
                "required": [
                  "file"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The archive was applied, or was identical to the current project. Read `data.outcome` first: `ingested` (then `data.kind` tells a staged upload from a queued build) or `unchanged` (nothing was written).",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "data": {
                          "type": "object",
                          "properties": {
                            "outcome": {
                              "type": "string",
                              "const": "ingested",
                              "description": "The door's outcome. `ingested` — the archive was staged or queued. A push onto a site that already holds a code project answers `202` with `pending_confirmation` first (the diff and a handle), and identical bytes answer `unchanged`; see those responses."
                            },
                            "siteId": {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$",
                              "description": "The site this upload landed on."
                            },
                            "siteName": {
                              "type": "string"
                            },
                            "kind": {
                              "type": "string",
                              "enum": [
                                "bundle",
                                "prebuilt",
                                "source"
                              ],
                              "description": "What the archive turned out to be. `bundle` and `prebuilt` are staged immediately and carry `revision`; `source` is queued for the build rail and carries `buildRunId`."
                            },
                            "revision": {
                              "description": "Present for a staged upload: the revision now staged.",
                              "type": "string"
                            },
                            "buildRunId": {
                              "description": "Present for a source upload: pass it to `page.build_status` as `build_run_id`.",
                              "type": "string"
                            },
                            "objectCount": {
                              "type": "integer"
                            },
                            "pageCount": {
                              "type": "integer"
                            },
                            "bytes": {
                              "type": "integer"
                            },
                            "findings": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "rule": {
                                    "type": "string"
                                  },
                                  "severity": {
                                    "type": "string"
                                  },
                                  "path": {
                                    "anyOf": [
                                      {
                                        "type": "string"
                                      },
                                      {
                                        "type": "null"
                                      }
                                    ]
                                  },
                                  "message": {
                                    "type": "string"
                                  }
                                },
                                "required": [
                                  "rule",
                                  "severity",
                                  "message"
                                ],
                                "additionalProperties": false
                              },
                              "description": "Conformance findings. ALWAYS present — an empty array means 'nothing to fix', not 'we did not check'."
                            },
                            "report": {
                              "type": "object",
                              "properties": {
                                "status": {
                                  "type": "string"
                                },
                                "kind": {
                                  "type": "string"
                                }
                              },
                              "required": [
                                "status",
                                "kind"
                              ],
                              "additionalProperties": {},
                              "description": "What the importer detected and accepted. Always read it: server routes, unsupported dependencies and unsafe paths surface here."
                            },
                            "deploySource": {
                              "type": "string",
                              "enum": [
                                "declared",
                                "legacy",
                                "synthesized"
                              ],
                              "description": "Where the deploy manifest came from — the author's `pages.deploy.json`, a translated legacy `pages.functions.json`, or one we synthesized."
                            },
                            "deploy": {
                              "$ref": "#/components/schemas/PagesDeployManifest"
                            }
                          },
                          "required": [
                            "bytes",
                            "deploy",
                            "deploySource",
                            "findings",
                            "kind",
                            "objectCount",
                            "outcome",
                            "pageCount",
                            "report",
                            "siteId",
                            "siteName"
                          ],
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "data"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "data": {
                          "type": "object",
                          "properties": {
                            "outcome": {
                              "type": "string",
                              "const": "unchanged"
                            },
                            "siteId": {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                            },
                            "siteName": {
                              "type": "string"
                            },
                            "kind": {
                              "type": "string",
                              "enum": [
                                "bundle",
                                "prebuilt",
                                "source"
                              ]
                            },
                            "base": {
                              "type": "object",
                              "properties": {
                                "kind": {
                                  "type": "string",
                                  "enum": [
                                    "managed",
                                    "bundle"
                                  ]
                                },
                                "ref": {
                                  "type": "string"
                                }
                              },
                              "required": [
                                "kind",
                                "ref"
                              ],
                              "additionalProperties": false
                            },
                            "buildRunId": {
                              "description": "Present only when the current project had no build that came up, so re-pushing it queued one. Still `unchanged`: not a byte was written — the stored tree already IS this archive — and a build of it is now running under this id. Absent on the ordinary no-op.",
                              "type": "string"
                            },
                            "buildBlocked": {
                              "description": "Present only when the current project has no successful build AND has spent every build attempt the rail allows, so re-pushing it queued nothing. The call still succeeds and is still `unchanged` — the archive was byte-identical and replaced nothing, so an idempotent re-push is not an error — but no further build will be attempted for these bytes: change a file and push again, which makes a new project the rail will build.",
                              "type": "object",
                              "properties": {
                                "reason": {
                                  "type": "string",
                                  "const": "attempts_exhausted"
                                },
                                "message": {
                                  "type": "string",
                                  "description": "The sentence to show a person, and their next step."
                                },
                                "attempts": {
                                  "type": "integer",
                                  "description": "The rail's ceiling, which this project has now spent."
                                }
                              },
                              "required": [
                                "reason",
                                "message",
                                "attempts"
                              ],
                              "additionalProperties": false
                            }
                          },
                          "required": [
                            "outcome",
                            "siteId",
                            "siteName",
                            "kind",
                            "base"
                          ],
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "data"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "The diff, shown first. The site already holds a code project and the archive differs from it; nothing was written. Read `data.diff`, then send the SAME archive again with `?confirm=<data.handle>` to apply it.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "const": true
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "outcome": {
                          "type": "string",
                          "const": "pending_confirmation"
                        },
                        "siteId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
                        },
                        "siteName": {
                          "type": "string"
                        },
                        "kind": {
                          "type": "string",
                          "enum": [
                            "bundle",
                            "prebuilt",
                            "source"
                          ]
                        },
                        "handle": {
                          "type": "string",
                          "description": "The confirmation handle — a commitment to THESE bytes against THIS base. Send the same archive again with `?confirm=<handle>` to apply. It expires the moment the site's current project moves."
                        },
                        "base": {
                          "type": "object",
                          "properties": {
                            "kind": {
                              "type": "string",
                              "enum": [
                                "managed",
                                "bundle"
                              ],
                              "description": "Which ledger the diff is against: the stored source tree, or the newest staged revision."
                            },
                            "ref": {
                              "type": "string",
                              "description": "The source ref or revision the diff is against."
                            }
                          },
                          "required": [
                            "kind",
                            "ref"
                          ],
                          "additionalProperties": false
                        },
                        "diff": {
                          "type": "object",
                          "properties": {
                            "identical": {
                              "type": "boolean",
                              "const": false
                            },
                            "added": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "path": {
                                    "type": "string"
                                  },
                                  "bytes": {
                                    "type": "integer"
                                  },
                                  "sha256": {
                                    "type": "string"
                                  }
                                },
                                "required": [
                                  "path",
                                  "bytes",
                                  "sha256"
                                ],
                                "additionalProperties": false
                              }
                            },
                            "removed": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "path": {
                                    "type": "string"
                                  },
                                  "bytes": {
                                    "type": "integer"
                                  },
                                  "sha256": {
                                    "type": "string"
                                  }
                                },
                                "required": [
                                  "path",
                                  "bytes",
                                  "sha256"
                                ],
                                "additionalProperties": false
                              }
                            },
                            "changed": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "path": {
                                    "type": "string"
                                  },
                                  "kind": {
                                    "type": "string",
                                    "enum": [
                                      "text",
                                      "binary"
                                    ]
                                  },
                                  "bytesBefore": {
                                    "type": "integer"
                                  },
                                  "bytesAfter": {
                                    "type": "integer"
                                  },
                                  "sha256Before": {
                                    "type": "string"
                                  },
                                  "sha256After": {
                                    "type": "string"
                                  },
                                  "hunks": {
                                    "description": "For a text change: unified hunks, one line per element (`@@ -a,b +c,d @@`, ` `, `-`, `+` prefixed), cut at the per-file bound. Absent for a binary change.",
                                    "type": "array",
                                    "items": {
                                      "type": "string"
                                    }
                                  },
                                  "truncated": {
                                    "description": "`true` when `hunks` was cut at the bound.",
                                    "type": "boolean"
                                  }
                                },
                                "required": [
                                  "path",
                                  "kind",
                                  "bytesBefore",
                                  "bytesAfter",
                                  "sha256Before",
                                  "sha256After"
                                ],
                                "additionalProperties": false
                              }
                            },
                            "unchangedCount": {
                              "type": "integer"
                            },
                            "summary": {
                              "type": "object",
                              "properties": {
                                "added": {
                                  "type": "integer"
                                },
                                "removed": {
                                  "type": "integer"
                                },
                                "changed": {
                                  "type": "integer"
                                },
                                "unchanged": {
                                  "type": "integer"
                                },
                                "bytesBefore": {
                                  "type": "integer"
                                },
                                "bytesAfter": {
                                  "type": "integer"
                                }
                              },
                              "required": [
                                "added",
                                "removed",
                                "changed",
                                "unchanged",
                                "bytesBefore",
                                "bytesAfter"
                              ],
                              "additionalProperties": false
                            }
                          },
                          "required": [
                            "identical",
                            "added",
                            "removed",
                            "changed",
                            "unchangedCount",
                            "summary"
                          ],
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "outcome",
                        "siteId",
                        "siteName",
                        "kind",
                        "handle",
                        "base",
                        "diff"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "ok",
                    "data"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "The body was not multipart/form-data with a `file` field, the archive failed the size or content guards, its `pages.deploy.json` did not match the contract, or `confirm` named a handle that no longer matches (`confirmation_stale`: the bytes differ or the current project moved — push again without it to see the new diff). The refusal names the field.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageIngestError"
                }
              }
            }
          },
          "401": {
            "description": "No bearer credential, or one that did not resolve.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageIngestError"
                }
              }
            }
          },
          "403": {
            "description": "Programmatic access is unavailable to this holder, the named workspace is outside the key's scope, or the holder lacks `pages.manage`. `workspace_ambiguous` and `workspace_unreachable` also answer here, and the slugs this key may pass are appended to `error.message`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageIngestError"
                }
              }
            }
          },
          "404": {
            "description": "The `siteId` is not a site in the resolved workspace.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageIngestError"
                }
              }
            }
          },
          "429": {
            "description": "The API key is over its rate limit. Wait for `Retry-After` before retrying.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageIngestError"
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server error occurred while handling the import.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageIngestError"
                }
              }
            }
          }
        }
      }
    },
    "/api/pages/ingest/validate": {
      "post": {
        "operationId": "validatePageArchive",
        "summary": "Dry-run an archive against every import screen",
        "description": "Runs the SAME screens `ingestPageArchive` runs — the manifest schema, the archive and path guards, the dependency allowlist, recipe resolution, the conformance gate and every declared ceiling — over the archive you send, and answers the FULL list of refusals at once. It spends no build, mints no revision and writes nothing: no site is created or modified, and sending the same archive to the import afterwards is what actually imports it. Read `screensRun` before treating an empty `refusals` as a guarantee: anything we cannot decide without compiling your project stays a build result. Authenticated exactly like the import, and metered as a read.",
        "tags": [
          "pages"
        ],
        "parameters": [
          {
            "name": "workspace",
            "in": "query",
            "required": false,
            "description": "Which workspace to act in — its slug or id. The SAME argument every workspace-scoped tool takes, resolved the same way: an account-wide key may select any workspace its holder currently reaches, a workspace-pinned key may only name its own, and a call that names nothing falls through to your default. It is a QUERY parameter rather than a body field on purpose: this endpoint's body is a multipart upload, and reading a field out of it would decode that body before the bearer and the rate limiter had run. Ignored for a signed-in session, whose workspace comes from its own claims.",
            "schema": {
              "type": "string",
              "minLength": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "file": {
                    "type": "string",
                    "format": "binary",
                    "description": "The single ZIP archive to screen."
                  },
                  "siteId": {
                    "type": "string",
                    "format": "uuid",
                    "description": "The site you intend to import onto. OPTIONAL, and it is NOT looked up — only its shape is checked. It decides one thing: whether the managed-adoption screen applies, which it does only when you are replacing the source of an existing site."
                  }
                },
                "required": [
                  "file"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The archive was screened. `data.ok` is the verdict; a `200` with `data.ok: false` is the ordinary answer for an archive that would be refused.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean",
                      "const": true
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "description": "`true` when nothing refused — importing these exact bytes would be accepted. `false` means `refusals` is non-empty."
                        },
                        "kind": {
                          "type": "string",
                          "enum": [
                            "bundle",
                            "prebuilt",
                            "source:astro",
                            "source:next",
                            "source:vite",
                            "source:static-generator",
                            "not_a_site"
                          ],
                          "description": "What the archive was classified as, from its CONTENTS."
                        },
                        "markers": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          },
                          "description": "The classifier's evidence, strongest first."
                        },
                        "recipe": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "The build recipe your project would be conformed onto, when one resolved."
                        },
                        "deploySource": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "declared",
                                "legacy",
                                "synthesized"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Where the deploy manifest came from — your `pages.deploy.json`, a translated legacy `pages.functions.json`, or one we synthesized."
                        },
                        "siteImportEnabled": {
                          "type": "boolean",
                          "description": "Whether source-project importing is switched on for your account. It CHANGES which screens apply, so two answers for the same bytes are only comparable when this matches."
                        },
                        "uploadBytes": {
                          "type": "integer",
                          "description": "The compressed bytes you sent."
                        },
                        "screensRun": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          },
                          "description": "Which screens actually ran. A screen that did not apply to this archive is ABSENT — so an empty `refusals` is 'these screens passed', never 'everything passed'. Anything we cannot decide without compiling your project (a type error, a failing integration) is not here and stays a build result."
                        },
                        "refusals": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "screen": {
                                "type": "string",
                                "description": "Which screen said no — a member of `screensRun`."
                              },
                              "where": {
                                "type": "string",
                                "enum": [
                                  "upload",
                                  "read",
                                  "build",
                                  "publish"
                                ],
                                "description": "The stage a real import would have discovered it at."
                              },
                              "code": {
                                "type": "string",
                                "description": "The same error code the import itself answers with."
                              },
                              "reason": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ],
                                "description": "The specific guard, when the screen named one."
                              },
                              "message": {
                                "type": "string",
                                "description": "The refusal sentence, exactly as an import states it."
                              },
                              "path": {
                                "anyOf": [
                                  {
                                    "type": "string"
                                  },
                                  {
                                    "type": "null"
                                  }
                                ],
                                "description": "The offending file, when the screen named one."
                              }
                            },
                            "required": [
                              "screen",
                              "where",
                              "code",
                              "reason",
                              "message",
                              "path"
                            ],
                            "additionalProperties": false
                          },
                          "description": "EVERY refusal, not the first one. The list is in the order the rail screens run, so fixing them top-down is fixing them in the order they would otherwise have cost you builds."
                        },
                        "advisories": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "screen": {
                                "type": "string",
                                "description": "Which screen reported it — a member of `screensRun`."
                              },
                              "code": {
                                "type": "string",
                                "description": "Stable code — `database.migration-count`. Key off this, never the sentence."
                              },
                              "message": {
                                "type": "string",
                                "description": "What an import would report, exactly as it says it."
                              }
                            },
                            "required": [
                              "screen",
                              "code",
                              "message"
                            ],
                            "additionalProperties": false
                          },
                          "description": "Figures your archive is past that an import REPORTS but does not refuse. They never make `refusals` non-empty."
                        },
                        "measurements": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "Stable dotted id — `functions.modules`, `archive.entries`."
                              },
                              "label": {
                                "type": "string",
                                "description": "What it counts, in one phrase."
                              },
                              "measured": {
                                "type": "number",
                                "description": "What your archive measured."
                              },
                              "limit": {
                                "type": "number",
                                "description": "The ceiling it is measured against."
                              },
                              "unit": {
                                "type": "string",
                                "enum": [
                                  "bytes",
                                  "files",
                                  "characters",
                                  "milliseconds",
                                  "requests"
                                ]
                              },
                              "over": {
                                "type": "boolean",
                                "description": "`true` when the number is past its figure — a refusal when `refusals` names it, an advisory when `advisories` does."
                              }
                            },
                            "required": [
                              "id",
                              "label",
                              "measured",
                              "limit",
                              "unit",
                              "over"
                            ],
                            "additionalProperties": false
                          },
                          "description": "Every ceiling this archive could be measured against, each beside the number you sent — so a project at 56 of 512 modules can see its headroom, not just the absence of a refusal."
                        }
                      },
                      "required": [
                        "ok",
                        "kind",
                        "markers",
                        "recipe",
                        "deploySource",
                        "siteImportEnabled",
                        "uploadBytes",
                        "screensRun",
                        "refusals",
                        "advisories",
                        "measurements"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "ok",
                    "data"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "The body was not multipart/form-data with a `file` field, or `siteId` was not the shape of a site id. A refusal the SCREENS made is a `200` with `data.ok: false`, not a `400`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageIngestError"
                }
              }
            }
          },
          "401": {
            "description": "No bearer credential, or one that did not resolve.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageIngestError"
                }
              }
            }
          },
          "403": {
            "description": "Programmatic access is unavailable to this holder, the named workspace is outside the key's scope, or importing is switched off for this account. `workspace_ambiguous` and `workspace_unreachable` also answer here, with the slugs appended to `error.message`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageIngestError"
                }
              }
            }
          },
          "429": {
            "description": "The API key is over its rate limit. Wait for `Retry-After` before retrying.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageIngestError"
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server error occurred while screening the archive.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageIngestError"
                }
              }
            }
          }
        }
      }
    },
    "/api/pages/{siteId}/export": {
      "get": {
        "operationId": "exportPageProject",
        "summary": "Download a site's code project as a zip",
        "description": "Streams the site's code project as the zip it would build from: a site you brought as a finished bundle gives back its newest staged revision (the platform's own `bundle.json` left out and its migration relocation undone, so the zip re-imports as it is); a site built here gives back its current source tree. The bytes are built on the way out and never stored, auth is re-checked on every call, and the zip is deterministic for a given revision. `X-Goosy-Export-Ref` names the revision or source ref the zip is byte-identical to. The site's database, storage, media and data tables are not part of the code project and are not in the zip. Pulling a site's code is recorded on the audit ledger and is not metered.",
        "tags": [
          "pages"
        ],
        "parameters": [
          {
            "name": "siteId",
            "in": "path",
            "required": true,
            "description": "The UUID of a site in the resolved workspace.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
            }
          },
          {
            "name": "workspace",
            "in": "query",
            "required": false,
            "description": "Which workspace to act in — its slug or id. The SAME argument every workspace-scoped tool takes, resolved the same way: an account-wide key may select any workspace its holder currently reaches, a workspace-pinned key may only name its own, and a call that names nothing falls through to your default. It is a QUERY parameter rather than a body field on purpose: this endpoint's body is a multipart upload, and reading a field out of it would decode that body before the bearer and the rate limiter had run.",
            "schema": {
              "type": "string",
              "minLength": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The zip. `Content-Disposition: attachment; filename=\"<site>-<ref>.zip\"`, `X-Goosy-Export-Kind` (`managed` or `bundle`) and `X-Goosy-Export-Ref` (the ref the zip is byte-identical to).",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "X-Goosy-Export-Kind": {
                "description": "`managed` — the current source tree; `bundle` — the newest staged revision.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "managed",
                    "bundle"
                  ]
                }
              },
              "X-Goosy-Export-Ref": {
                "description": "The source ref or revision this zip re-imports to, byte for byte.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/zip": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "401": {
            "description": "No bearer credential, or one that did not resolve.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              }
            },
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "description": "Programmatic access is unavailable to this holder, the named workspace is outside the key's scope, or the holder lacks `pages.manage`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              }
            },
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "The `siteId` is not a site in the resolved workspace, or the site holds nothing to export yet.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              }
            },
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "description": "An unexpected server error occurred while building the zip.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              }
            },
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/jobs/{id}": {
      "get": {
        "operationId": "get_job",
        "summary": "Read a job by its handle",
        "description": "The same read as `POST /api/v1/tools/jobs.read`, by the `job_id` a long-running call answered: its status, when it started and finished, what to read next once it has succeeded, and an error code once it has failed. A handle from another workspace answers `jobs.not_found`, exactly as one that names nothing.",
        "tags": [
          "jobs"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The job_id a long-running call answered (for example videos.generate_clip).",
            "schema": {
              "type": "string",
              "minLength": 1
            }
          },
          {
            "name": "workspace",
            "in": "query",
            "required": false,
            "description": "The slug of the workspace to read in — the same `workspace` argument the tool takes. Omit it to use the key's workspace.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "x-goosy-tool-error": {
                "description": "`true` when a boundary step refused the call — workspace resolution failed or could not be read. A tool that ran and returned its own typed `ok: false` reports `false` here. **Branch on `ok` in the body for the outcome; this header is the transport-level hint.**",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "object",
                      "description": "The tool ran and answered.",
                      "properties": {
                        "ok": {
                          "type": "boolean",
                          "const": true
                        },
                        "job_id": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "queued",
                            "running",
                            "succeeded",
                            "failed"
                          ],
                          "description": "queued — accepted, not started; running — under way; succeeded — done, read `result`; failed — it stopped, see error_code."
                        },
                        "created_at": {
                          "type": "string",
                          "description": "When the job was asked for (ISO 8601)."
                        },
                        "started_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "When it started running, or null before it has."
                        },
                        "completed_at": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "When it finished, or null while it has not."
                        },
                        "result": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "type": {
                                  "type": "string",
                                  "enum": [
                                    "clip",
                                    "video",
                                    "brand_fact"
                                  ]
                                },
                                "id": {
                                  "type": "string"
                                }
                              },
                              "required": [
                                "type",
                                "id"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Once succeeded: what to read next — the clip made, the video the run wrote, or the brand kit fact the confirm confirmed (read it with brand_kit.read). Null until then."
                        },
                        "error_code": {
                          "anyOf": [
                            {
                              "type": "string"
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Once failed: a stable code for why. Null otherwise."
                        },
                        "workspace": {
                          "type": "string",
                          "description": "The slug of the workspace this call ran in."
                        },
                        "working_in": {
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "description": "The chip words — e.g. \"working in: Acme Main\"."
                            },
                            "note": {
                              "type": "string",
                              "description": "Why this workspace — e.g. \"your default\", \"this call only\"."
                            },
                            "workspace": {
                              "type": "string",
                              "description": "The resolved workspace's slug."
                            },
                            "source": {
                              "type": "string",
                              "enum": [
                                "call-override",
                                "key-pin",
                                "stored-default",
                                "sole-reachable"
                              ],
                              "description": "Which rung of the R7 precedence resolved the workspace."
                            }
                          },
                          "required": [
                            "label",
                            "note",
                            "workspace",
                            "source"
                          ],
                          "description": "Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.",
                          "additionalProperties": false
                        }
                      },
                      "required": [
                        "ok",
                        "completed_at",
                        "created_at",
                        "error_code",
                        "job_id",
                        "result",
                        "started_at",
                        "status",
                        "working_in",
                        "workspace"
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ToolRefusal"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "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.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No such tool. The body names no tool and is identical for every unrecognised name.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.",
            "headers": {
              "x-goosy-api": {
                "description": "Present while this API is in beta; the value is `beta`.",
                "schema": {
                  "type": "string",
                  "const": "beta"
                }
              },
              "x-request-id": {
                "description": "This request's id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.",
                "schema": {
                  "type": "string"
                }
              },
              "Deprecation": {
                "description": "RFC 9745: this refusal's nested `error` object is deprecated, since this instant (`@<unix seconds>`).",
                "schema": {
                  "type": "string"
                }
              },
              "Sunset": {
                "description": "RFC 8594: the nested `error` object may be removed after this date (2026-12-31).",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "The page that says what to read instead (`rel=\"deprecation\"`).",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests this key may make in a rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current rolling minute.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "RateLimit-Reset": {
                "description": "Whole seconds until the window frees more requests.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Whole seconds to wait before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  }
}
