Update a custom tool

update a custom tool.

PATCH https://api.centerfy.ai/webhooks/inbound/custom-tools/:id

Headers

HeaderRequiredValueDescription
x-api-keyYesyour sub-account API key (cfy_…)authenticates the request; or Authorization: Bearer <key>.
Content-TypeYesapplication/jsonrequest body is JSON.

Path parameters

NameTypeRequiredDescription
idstring (uuid)Yesthe custom tool id.

Body parameters

NameTypeRequiredDefaultDescription
namestringNo—partial update — only sent keys change. If sent, it must be non-empty (400 ‘name cannot be blank’); re-normalised (lowercased, spaces → underscores).
descriptionstringNo—if sent, replaces the description; an empty value clears it.
urlstringNo—if sent, it must be non-empty (400 ‘url cannot be blank’).
methodstringNo—if sent, it must be non-empty (400 ‘method cannot be blank’); uppercased and must be one of GET, POST, PUT, PATCH, DELETE (else 400).
auth_requiredbooleanNo—if sent, set to true only when exactly true, otherwise false.
api_keystringNo—if sent, replaces the stored secret (an empty value clears it). Never echoed back.
parametersarrayNo—if sent, must be an array of parameter objects { name, type, description, required } (else 400).

Request body

{
  "description": "Look up an order by its id and return status",
  "method": "GET",
  "auth_required": true,
  "parameters": [
    {
      "name": "order_id",
      "type": "string",
      "description": "The order id",
      "required": true
    }
  ]
}

Example

curl -X PATCH "https://api.centerfy.ai/webhooks/inbound/custom-tools/{id}" \
  -H "x-api-key: $CENTERFY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "description": "Look up an order by its id and return status",
  "method": "GET",
  "auth_required": true,
  "parameters": [
    {
      "name": "order_id",
      "type": "string",
      "description": "The order id",
      "required": true
    }
  ]
}'
import { CenterfyClient } from "@centerfy/sdk";

const centerfy = new CenterfyClient({ apiKey: process.env.CENTERFY_API_KEY! });

const result = await centerfy.customTools.update("<toolId>", {
  "description": "Look up an order by its id and return status",
  "method": "GET",
  "auth_required": true,
  "parameters": [
    {
      "name": "order_id",
      "type": "string",
      "description": "The order id",
      "required": true
    }
  ]
});
console.log(result);
centerfy customTools update <toolId> '{"description":"Look up an order by its id and return status","method":"GET","auth_required":true,"parameters":[{"name":"order_id","type":"string","description":"The order id","required":true}]}'

MCP tool: centerfy_custom_tools_update (see MCP server)

Response

{
  "status": "success",
  "updated": true,
  "custom_tool": {
    "id": "a1b2c3d4-5555-6666-7777-888899990000",
    "name": "lookup_order",
    "description": "Look up an order by its id and return status",
    "url": "https://api.example.com/orders",
    "method": "GET",
    "auth_required": true,
    "has_api_key": true,
    "parameters": [
      {
        "name": "order_id",
        "type": "string",
        "description": "The order id",
        "required": true
      }
    ],
    "created_at": "2026-06-01T12:00:00.000Z",
    "updated_at": "2026-06-12T11:00:00.000Z"
  }
}

Errors

  • 400 — also for a blank name, url, or method, an invalid method, or non-array parameters.
  • 404 — if the custom tool does not exist.
  • 500 — on failure.

Notes

Partial update — only fields present in the body change. All body fields are optional, but at least one updatable field must be sent (400 ‘no updatable fields provided’).

© 2026 Centerfy AI. All rights reserved.