> ## Documentation Index
> Fetch the complete documentation index at: https://docs.goosybear.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Call videos.compose_plan

> Put together the plan for a video or a short from the answers so far — 'put the plan together', 'show me the plan for this short', 'just draw it'. Send `kind` "video" or "short" and the brief's id. It works on an unfinished brief: any ask to see the plan, a draft of it or where it stands calls it, whatever is still open — never describe the plan from memory, never reply that it cannot be drawn yet, and never take the ask as an answer to the open question (it is not a yes to looking at YouTube). For a video it draws the plan from the answers so far, and a question with a sensible default that is still unanswered (one video or a series, whether to look at YouTube first) takes it, saved on the brief as assumed, and `assumed` lists each one so the reply can say what was assumed and that the person can change it. Four are only ever the person's — what the video is, who is on screen and where, the voice, and what it is about: while one is open the plan waits, `open_questions` names it, and the reply asks it. This makes nothing, spends nothing and runs no YouTube look — it is made when the person says to make it (there is no button for that in the chat), and a short's film once they press Goosify it on its storyboard.

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



## OpenAPI

````yaml /openapi.json post /api/v1/tools/videos.compose_plan
openapi: 3.1.0
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: []
paths:
  /api/v1/tools/videos.compose_plan:
    post:
      tags:
        - videos
      summary: Call videos.compose_plan
      description: >-
        Put together the plan for a video or a short from the answers so far —
        'put the plan together', 'show me the plan for this short', 'just draw
        it'. Send `kind` "video" or "short" and the brief's id. It works on an
        unfinished brief: any ask to see the plan, a draft of it or where it
        stands calls it, whatever is still open — never describe the plan from
        memory, never reply that it cannot be drawn yet, and never take the ask
        as an answer to the open question (it is not a yes to looking at
        YouTube). For a video it draws the plan from the answers so far, and a
        question with a sensible default that is still unanswered (one video or
        a series, whether to look at YouTube first) takes it, saved on the brief
        as assumed, and `assumed` lists each one so the reply can say what was
        assumed and that the person can change it. Four are only ever the
        person's — what the video is, who is on screen and where, the voice, and
        what it is about: while one is open the plan waits, `open_questions`
        names it, and the reply asks it. This makes nothing, spends nothing and
        runs no YouTube look — it is made when the person says to make it (there
        is no button for that in the chat), and a short's film once they press
        Goosify it on its storyboard.


        Every result names the workspace it ran in. Say which workspace the
        answer is about. When the account has more than one workspace and none
        is selected, this tool refuses with `workspace_ambiguous` and lists the
        choices — offer them, never pick one.
      operationId: call_videos_compose_plan
      parameters:
        - name: x-request-id
          in: header
          required: false
          description: >-
            Your own id for this request, echoed back and recorded on the audit
            trail. 1–128 characters from `A–Z a–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: >-
                    What it acts on: "video" for one video, "short" for one
                    short. Leave it out for a video.
                  type: string
                  enum:
                    - video
                    - short
                brief_id:
                  type: string
                  description: >-
                    With kind "video": The video brief's 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 video's
                    plan and means that plan ('make it two minutes', 'write
                    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 video they mean. Never invent an id. With kind
                    "short": 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.
                workspace:
                  description: >-
                    Which workspace to run in — its slug. Omit to use 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:
                        type:
                          - string
                          - 'null'
                      readback:
                        type:
                          - string
                          - 'null'
                      learned:
                        type:
                          - string
                          - 'null'
                      chapters:
                        type: array
                        items:
                          type: object
                          properties:
                            number:
                              type: integer
                            name:
                              type: string
                            line:
                              type:
                                - string
                                - 'null'
                            seconds:
                              type: integer
                            made_by:
                              type: string
                              enum:
                                - you
                                - goosy
                                - screen
                          required:
                            - number
                            - name
                            - line
                            - seconds
                            - made_by
                          additionalProperties: false
                      clips:
                        type: array
                        items:
                          type: object
                          properties:
                            name:
                              type: string
                            seconds:
                              type: integer
                          required:
                            - name
                            - seconds
                          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
                      assumed:
                        description: >-
                          Every answer Goosy assumed because the person had not
                          given it. Name each in one sentence and say they can
                          change any of them.
                        type: array
                        items:
                          type: object
                          properties:
                            question:
                              type: string
                              description: The question, as the brief names it.
                            value:
                              type: string
                              description: What Goosy assumed, in the member's words.
                            why:
                              type: string
                          required:
                            - question
                            - value
                            - why
                          additionalProperties: false
                      length:
                        anyOf:
                          - anyOf:
                              - type: object
                                properties:
                                  seconds:
                                    type: integer
                                    description: The plan's own length.
                                  target_seconds:
                                    type: integer
                                    description: The length it is drawn toward.
                                  low_seconds:
                                    type: integer
                                  high_seconds:
                                    type: integer
                                  within_target:
                                    type: boolean
                                    description: >-
                                      True when the plan's length is inside the
                                      band — the right result.
                                  set_by:
                                    type: string
                                    enum:
                                      - script
                                      - stated
                                      - derived
                                    description: >-
                                      Whose length: the person's script, the
                                      person, or Goosy's own read.
                                  why:
                                    type: string
                                  note:
                                    description: >-
                                      Set only when the person's script sets
                                      another length than they asked: say this
                                      sentence.
                                    type:
                                      - string
                                      - 'null'
                                required:
                                  - seconds
                                  - target_seconds
                                  - low_seconds
                                  - high_seconds
                                  - within_target
                                  - set_by
                                  - why
                                  - note
                                additionalProperties: false
                              - type: 'null'
                          - type:
                              - string
                              - 'null'
                      style:
                        type:
                          - string
                          - 'null'
                      ratio:
                        type:
                          - string
                          - 'null'
                      beats:
                        type: array
                        items:
                          type: object
                          properties:
                            number:
                              type: integer
                            name:
                              type: string
                            line:
                              type:
                                - string
                                - 'null'
                            seconds:
                              type:
                                - integer
                                - 'null'
                            budget:
                              type: string
                            made_by:
                              type: string
                              enum:
                                - you
                                - goosy
                                - screen
                          required:
                            - number
                            - name
                            - line
                            - seconds
                            - budget
                            - made_by
                          additionalProperties: false
                      their_words:
                        anyOf:
                          - type: object
                            properties:
                              kind:
                                anyOf:
                                  - type: string
                                    enum:
                                      - script
                                      - notes
                                  - type: 'null'
                              words:
                                type: integer
                            required:
                              - kind
                              - words
                            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: >-
                              Why this workspace was chosen: the call named it
                              (`call-override`), the key is pinned to it
                              (`key-pin`), it is your default
                              (`stored-default`), or it is the only one the key
                              reaches (`sole-reachable`).
                        required:
                          - label
                          - note
                          - workspace
                          - source
                        description: >-
                          Which workspace this call ran in, and how that was
                          decided. Present on every workspace-scoped result.
                        additionalProperties: false
                    required:
                      - ok
                      - learned
                      - open_questions
                      - 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'
components:
  schemas:
    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
    Error:
      type: object
      properties:
        ok:
          type: boolean
          const: false
        code:
          type: string
          description: >-
            The typed refusal code — e.g. `tenant_mcp.rate_limited`,
            `tenant_api.unknown_tool`.
        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
  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.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.