Skip to main content
PUT
/
v1
/
tools
/
revisions
/
{revision_id}
Update a tool revision
curl --request PUT \
  --url https://api-sandbox.featherhq.com/v1/tools/revisions/{revision_id} \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: <api-key>' \
  --data '
{
  "name": "<string>",
  "description": "<string>",
  "configuration": {
    "url": "<string>",
    "method": "GET",
    "headers": [
      {
        "key": "<string>",
        "value": "<string>",
        "secure": false
      }
    ],
    "query_params": [
      {
        "key": "<string>",
        "value": "<string>",
        "secure": false
      }
    ],
    "body": {},
    "timeout": 30,
    "variables": [
      {
        "name": "<string>",
        "type": "str",
        "description": "<string>",
        "required": false
      }
    ],
    "retry": {
      "max_retries": 0,
      "base_delay_seconds": 1,
      "max_delay_seconds": 30,
      "jitter": true
    }
  },
  "transfer_target": {
    "destination": "<string>",
    "mode": "cold"
  },
  "response_schema": {
    "field_mappings": [
      {
        "path": "<string>",
        "alias": "<string>"
      }
    ]
  },
  "input_defaults": {}
}
'
{
  "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
  "tool_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
  "name": "<string>",
  "description": "<string>",
  "status": "<string>",
  "created_by": "<string>",
  "created_at": "2023-11-07T05:31:56Z",
  "updated_at": "2023-11-07T05:31:56Z",
  "default_count": 123,
  "pinned_count": 123,
  "stale_input_fields": [
    "<string>"
  ],
  "merged_input_preview": {},
  "configuration": {
    "url": "<string>",
    "method": "GET",
    "headers": [
      {
        "key": "<string>",
        "value": "<string>",
        "secure": false
      }
    ],
    "query_params": [
      {
        "key": "<string>",
        "value": "<string>",
        "secure": false
      }
    ],
    "body": {},
    "timeout": 30,
    "variables": [
      {
        "name": "<string>",
        "type": "str",
        "description": "<string>",
        "required": false
      }
    ],
    "retry": {
      "max_retries": 0,
      "base_delay_seconds": 1,
      "max_delay_seconds": 30,
      "jitter": true
    }
  },
  "transfer_target": {
    "destination": "<string>",
    "mode": "cold"
  },
  "response_schema": {
    "field_mappings": [
      {
        "path": "<string>",
        "alias": "<string>"
      }
    ]
  },
  "has_secrets": false,
  "input_defaults": {}
}

Authorizations

x-api-key
string
header
required

Path Parameters

revision_id
string<uuid>
required

Body

application/json

Mutable fields on a single ToolRevision.

input_defaults is the operator-set input-arg config for input variables ({variable_name: {"value": ..., "type": "default"|"pinned"}} — ENG-590): a default the agent may override, or a pinned value it cannot; neither is injected at runtime in this scope. It is validated at the service layer against the revision's effective variables (the row + any configuration in the same request), so a wrong-type value or unknown variable is rejected there with a 422.

Unlike the sibling fields (which use is not None gating), input_defaults is written via model_fields_set so an explicit null clears all config while omitting the field is a no-op.

name
string | null
description
string | null
configuration
APICallConfiguration · object

Configuration for an API_CALL tool, stored in Tool.configuration.

Supports {{variable}} placeholders in url, headers, and body that are resolved at execution time from the tool's input variables and runtime metadata (via {{metadata.key}}).

transfer_target
TransferTargetInput · object

Operator-supplied config for a shared call_transfer target (ENG, voice).

The reusable cold-transfer destination. Mirrors the storage-facing fields of :class:~src.shared.transfer_contracts.TransferTargetConfig; the request layer only checks shape/mode here, while destination validity (E.164 or sip: URI) is enforced at the service layer via :func:~src.custom_tools.api._shared.transfer_target.validate_transfer_target_config so a bad destination surfaces as a clean 422. The label / when-to-use are carried on the Tool's name / description, not here.

response_schema
ResponseFieldSelector · object

Defines which fields to extract from a tool response.

status
enum<string> | null
Available options:
active,
deprecated,
disabled
input_defaults
Input Defaults · object

Response

Successful Response

id
string<uuid>
required
tool_id
string<uuid>
required
name
string
required
description
string | null
required
status
string
required
created_by
string | null
required
created_at
string<date-time>
required
updated_at
string<date-time>
required
default_count
integer
required
read-only

How many input variables carry an operator default (ENG-590).

pinned_count
integer
required
read-only

How many input variables are operator-pinned (ENG-590).

stale_input_fields
string[]
required
read-only

Configured variables removed/renamed/retyped by an operator edit.

merged_input_preview
Merged Input Preview · object
required
read-only

The input schema with each operator value injected as default.

configuration
APICallConfiguration · object

Configuration for an API_CALL tool, stored in Tool.configuration.

Supports {{variable}} placeholders in url, headers, and body that are resolved at execution time from the tool's input variables and runtime metadata (via {{metadata.key}}).

transfer_target
TransferTargetView · object

A call_transfer revision's stored target, surfaced on reads.

ToolRevisionResponse.configuration is api_call-typed and parses to None for a transfer config (it has no url), so this field carries the destination/mode back for the transfer-target picker. label / when_to_use come from the parent Tool's name / description.

response_schema
ResponseFieldSelector · object

Defines which fields to extract from a tool response.

has_secrets
boolean
default:false
input_defaults
Input Defaults · object