Update a custom tool
update a custom tool.
PATCH
https://api.centerfy.ai/webhooks/inbound/custom-tools/:id Headers
| Header | Required | Value | Description |
|---|---|---|---|
x-api-key | Yes | your sub-account API key (cfy_…) | authenticates the request; or Authorization: Bearer <key>. |
Content-Type | Yes | application/json | request body is JSON. |
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string (uuid) | Yes | the custom tool id. |
Body parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
name | string | No | — | partial update — only sent keys change. If sent, it must be non-empty (400 ‘name cannot be blank’); re-normalised (lowercased, spaces → underscores). |
description | string | No | — | if sent, replaces the description; an empty value clears it. |
url | string | No | — | if sent, it must be non-empty (400 ‘url cannot be blank’). |
method | string | No | — | 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_required | boolean | No | — | if sent, set to true only when exactly true, otherwise false. |
api_key | string | No | — | if sent, replaces the stored secret (an empty value clears it). Never echoed back. |
parameters | array | No | — | 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’).