Delete a tool
curl --request DELETE \
--url https://api.kallabot.com/v1/tools/{tool_id} \
--header 'Authorization: Bearer <token>' \
--header 'If-Match: <if-match>'const options = {
method: 'DELETE',
headers: {'If-Match': '<if-match>', Authorization: 'Bearer <token>'}
};
fetch('https://api.kallabot.com/v1/tools/{tool_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.kallabot.com/v1/tools/{tool_id}"
headers = {
"If-Match": "<if-match>",
"Authorization": "Bearer <token>"
}
response = requests.delete(url, headers=headers)
print(response.text){
"type": "https://docs.kallabot.com/errors/unsupported_api_version",
"title": "Kallabot-Version names a version this API doesn't have",
"status": 400,
"code": "unsupported_api_version",
"retryable": false
}{
"type": "https://docs.kallabot.com/errors/unauthenticated",
"title": "Missing or invalid API key",
"status": 401,
"code": "unauthenticated",
"retryable": false
}{
"type": "https://docs.kallabot.com/errors/insufficient_scope",
"title": "The key lacks a required scope",
"status": 403,
"code": "insufficient_scope",
"retryable": false
}{
"type": "https://docs.kallabot.com/errors/not_found",
"title": "Not found (or not visible to this key)",
"status": 404,
"code": "not_found",
"retryable": false
}{
"type": "https://docs.kallabot.com/errors/revision_conflict",
"title": "Conflicts with the resource's current state",
"status": 409,
"code": "revision_conflict",
"retryable": false
}{
"type": "https://docs.kallabot.com/errors/revision_conflict",
"title": "The If-Match revision is stale",
"status": 412,
"code": "revision_conflict",
"retryable": false
}{
"type": "https://docs.kallabot.com/errors/invalid_request",
"title": "One or more fields are not valid",
"status": 422,
"code": "invalid_request",
"retryable": false
}{
"type": "https://docs.kallabot.com/errors/sdk_version_unsupported",
"title": "This SDK release is switched off: upgrade the SDK",
"status": 426,
"code": "sdk_version_unsupported",
"retryable": false
}{
"type": "https://docs.kallabot.com/errors/precondition_required",
"title": "A required header is missing (Idempotency-Key or If-Match)",
"status": 428,
"code": "precondition_required",
"retryable": false
}{
"type": "https://docs.kallabot.com/errors/rate_limited",
"title": "Too many requests",
"status": 429,
"code": "rate_limited",
"retryable": true
}{
"type": "https://docs.kallabot.com/errors/internal_error",
"title": "Something went wrong on our side",
"status": 500,
"code": "internal_error",
"retryable": true
}Tools
Delete a tool
Deletes a tool. Send If-Match with its version. Returns 409 while a draft or published agent version still uses it.
Scopes: tool:write
DELETE
/
v1
/
tools
/
{tool_id}
Delete a tool
curl --request DELETE \
--url https://api.kallabot.com/v1/tools/{tool_id} \
--header 'Authorization: Bearer <token>' \
--header 'If-Match: <if-match>'const options = {
method: 'DELETE',
headers: {'If-Match': '<if-match>', Authorization: 'Bearer <token>'}
};
fetch('https://api.kallabot.com/v1/tools/{tool_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.kallabot.com/v1/tools/{tool_id}"
headers = {
"If-Match": "<if-match>",
"Authorization": "Bearer <token>"
}
response = requests.delete(url, headers=headers)
print(response.text){
"type": "https://docs.kallabot.com/errors/unsupported_api_version",
"title": "Kallabot-Version names a version this API doesn't have",
"status": 400,
"code": "unsupported_api_version",
"retryable": false
}{
"type": "https://docs.kallabot.com/errors/unauthenticated",
"title": "Missing or invalid API key",
"status": 401,
"code": "unauthenticated",
"retryable": false
}{
"type": "https://docs.kallabot.com/errors/insufficient_scope",
"title": "The key lacks a required scope",
"status": 403,
"code": "insufficient_scope",
"retryable": false
}{
"type": "https://docs.kallabot.com/errors/not_found",
"title": "Not found (or not visible to this key)",
"status": 404,
"code": "not_found",
"retryable": false
}{
"type": "https://docs.kallabot.com/errors/revision_conflict",
"title": "Conflicts with the resource's current state",
"status": 409,
"code": "revision_conflict",
"retryable": false
}{
"type": "https://docs.kallabot.com/errors/revision_conflict",
"title": "The If-Match revision is stale",
"status": 412,
"code": "revision_conflict",
"retryable": false
}{
"type": "https://docs.kallabot.com/errors/invalid_request",
"title": "One or more fields are not valid",
"status": 422,
"code": "invalid_request",
"retryable": false
}{
"type": "https://docs.kallabot.com/errors/sdk_version_unsupported",
"title": "This SDK release is switched off: upgrade the SDK",
"status": 426,
"code": "sdk_version_unsupported",
"retryable": false
}{
"type": "https://docs.kallabot.com/errors/precondition_required",
"title": "A required header is missing (Idempotency-Key or If-Match)",
"status": 428,
"code": "precondition_required",
"retryable": false
}{
"type": "https://docs.kallabot.com/errors/rate_limited",
"title": "Too many requests",
"status": 429,
"code": "rate_limited",
"retryable": true
}{
"type": "https://docs.kallabot.com/errors/internal_error",
"title": "Something went wrong on our side",
"status": 500,
"code": "internal_error",
"retryable": true
}Authorizations
An API key from Settings → API keys, sent as Authorization: Bearer kb_live_…. A workspace key starts kb_; a personal key starts kbp_ and acts as its owner.
Headers
The revision you read (its ETag, an integer in quotes such as "7"), so a stale write is refused with 412. Required: a write without it is refused with 428.
Pattern:
^(W/)?"?[0-9]+"?$Example:
"\"7\""
The API version to answer as, a date (YYYY-MM-DD). Leave it out for the current version (2026-11-07). An unknown version is refused with 400 unsupported_api_version.
Available options:
2026-11-07 Example:
"2026-11-07"
Path Parameters
Response
Successful Response