Goosy Bear Copy API

The copy API from Goosy Bear — 1 operation(s) for copy.

GitHub OpenAPI

Operations 1

POST /api/v1/tools/copy.draft Call copy.draft #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/goosybear-ai:goosybear-ai-copy-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

goosybear-ai-copy-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Goosybear Ai Copy API
  version: 1.0.0-beta
  description: 'Operations tagged copy across 2 of this provider''s published API definitions: goosybear-ai-openapi.json, goosybear-ai-openapi.yml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://app.goosybear.ai
  description: Production
security:
- tenantApiKey: []
tags:
- name: copy
paths:
  /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. Call it on the ask: the member''s own ask runs it at once, and only a call nobody asked for raises the approval card first, which is the member''s confirmation. 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.


        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.'
      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: '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
                  - working_in
                  - workspace
                - $ref: '#/components/schemas/ToolRefusal'
        '400':
          description: 'The request could not be used: the body is present but not a JSON object (`tenant_api.malformed_body`); it is a top-level array carrying more messages than this endpoint accepts (`tenant_mcp.batch_too_large`); or the `Idempotency-Key` header is malformed (`tenant_api.idempotency_key_invalid`), disagrees with the body''s `idempotency_key` (`tenant_api.idempotency_key_conflict`), or was sent to an action that cannot replay a retry (`tenant_api.idempotency_unsupported`). Nothing ran.'
          headers:
            x-goosy-api:
              description: Present while this API is in beta; the value is `beta`.
              schema:
                type: string
                const: beta
            x-request-id:
              description: 'This request''s id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.'
              schema:
                type: string
            Deprecation:
              description: 'RFC 9745: this refusal''s nested `error` object is deprecated, since this instant (`@<unix seconds>`).'
              schema:
                type: string
            Sunset:
              description: 'RFC 8594: the nested `error` object may be removed after this date (2026-12-31).'
              schema:
                type: string
            Link:
              description: The page that says what to read instead (`rel="deprecation"`).
              schema:
                type: string
            RateLimit-Limit:
              description: Requests this key may make in a rolling minute.
              schema:
                type: integer
                minimum: 1
            RateLimit-Remaining:
              description: Requests left in the current rolling minute.
              schema:
                type: integer
                minimum: 0
            RateLimit-Reset:
              description: Whole seconds until the window frees more requests.
              schema:
                type: integer
                minimum: 1
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: No bearer credential, or one that did not resolve. Deliberately ONE undifferentiated answer for absent / unknown / revoked / expired, so the endpoint is never an oracle over the key space.
          headers:
            x-goosy-api:
              description: Present while this API is in beta; the value is `beta`.
              schema:
                type: string
                const: beta
            x-request-id:
              description: 'This request''s id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.'
              schema:
                type: string
            Deprecation:
              description: 'RFC 9745: this refusal''s nested `error` object is deprecated, since this instant (`@<unix seconds>`).'
              schema:
                type: string
            Sunset:
              description: 'RFC 8594: the nested `error` object may be removed after this date (2026-12-31).'
              schema:
                type: string
            Link:
              description: The page that says what to read instead (`rel="deprecation"`).
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: The credential is good but the surface is not open to it — the platform or account API switch is off, or the holder lacks the `api.access` capability. The `code` says which.
          headers:
            x-goosy-api:
              description: Present while this API is in beta; the value is `beta`.
              schema:
                type: string
                const: beta
            x-request-id:
              description: 'This request''s id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.'
              schema:
                type: string
            Deprecation:
              description: 'RFC 9745: this refusal''s nested `error` object is deprecated, since this instant (`@<unix seconds>`).'
              schema:
                type: string
            Sunset:
              description: 'RFC 8594: the nested `error` object may be removed after this date (2026-12-31).'
              schema:
                type: string
            Link:
              description: The page that says what to read instead (`rel="deprecation"`).
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: No such tool. The body names no tool and is identical for every unrecognised name.
          headers:
            x-goosy-api:
              description: Present while this API is in beta; the value is `beta`.
              schema:
                type: string
                const: beta
            x-request-id:
              description: 'This request''s id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.'
              schema:
                type: string
            Deprecation:
              description: 'RFC 9745: this refusal''s nested `error` object is deprecated, since this instant (`@<unix seconds>`).'
              schema:
                type: string
            Sunset:
              description: 'RFC 8594: the nested `error` object may be removed after this date (2026-12-31).'
              schema:
                type: string
            Link:
              description: The page that says what to read instead (`rel="deprecation"`).
              schema:
                type: string
            RateLimit-Limit:
              description: Requests this key may make in a rolling minute.
              schema:
                type: integer
                minimum: 1
            RateLimit-Remaining:
              description: Requests left in the current rolling minute.
              schema:
                type: integer
                minimum: 0
            RateLimit-Reset:
              description: Whole seconds until the window frees more requests.
              schema:
                type: integer
                minimum: 1
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.
          headers:
            x-goosy-api:
              description: Present while this API is in beta; the value is `beta`.
              schema:
                type: string
                const: beta
            x-request-id:
              description: 'This request''s id: the `x-request-id` you sent when it was well formed, otherwise one generated for you. Quote it to support; it is recorded on every audit row the call wrote.'
              schema:
                type: string
            Deprecation:
              description: 'RFC 9745: this refusal''s nested `error` object is deprecated, since this instant (`@<unix seconds>`).'
              schema:
                type: string
            Sunset:
              description: 'RFC 8594: the nested `error` object may be removed after this date (2026-12-31).'
              schema:
                type: string
            Link:
              description: The page that says what to read instead (`rel="deprecation"`).
              schema:
                type: string
            RateLimit-Limit:
              description: Requests this key may make in a rolling minute.
              schema:
                type: integer
                minimum: 1
            RateLimit-Remaining:
              description: Requests left in the current rolling minute.
              schema:
                type: integer
                minimum: 0
            RateLimit-Reset:
              description: Whole seconds until the window frees more requests.
              schema:
                type: integer
                minimum: 1
            Retry-After:
              description: Whole seconds to wait before retrying.
              schema:
                type: integer
                minimum: 1
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
    servers:
    - url: https://app.goosybear.ai
      description: Production
components:
  schemas:
    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
    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
  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.'
x-refined-from:
- goosybear-ai-openapi.json
- goosybear-ai-openapi.yml