The custom tool object

Shape of a Custom Tool, a user-defined HTTP endpoint that agents can call as if it were a built-in tool.

A CustomTool is a user-defined HTTP endpoint exposed to agents as if it were a built-in tool. Define the method, URL, parameters, and auth once; assign to any agent.

Object shape

{
  "id": "tool_64f1c0ef2ec711ef6dc1dcf",
  "name": "custom_list_postmark_templates",
  "label": "List Postmark Templates",
  "description": "Returns the list of email templates from Postmark.",
  "type": "read",
  "method": "GET",
  "url": "https://api.postmarkapp.com/templates",
  "headers": { "Accept": "application/json" },
  "body_template": null,
  "parameters": [
    {
      "name": "count",
      "type": "integer",
      "description": "How many templates to return.",
      "required": false,
      "in": "query"
    }
  ],
  "auth": { "type": "api_key", "header_name": "X-Postmark-Server-Token" },
  "group": { "name": "Postmark", "icon": null, "color": null },
  "created_at": "2026-06-01T00:00:00.000Z",
  "updated_at": "2026-06-20T12:00:00.000Z"
}

Attributes

FieldTypeNotes
idstringtool_<24 hex>.
namestringAuto-generated slug from label, prefixed custom_. Immutable after creation. Used in agent.tools[].name.
labelstringHuman-friendly display name. Include the connector + resource ("List Postmark Templates", not "List Templates").
descriptionstringLLM-facing description. Determines when the tool gets called.
typeenum"read" or "write". Write tools require approval in chat.
methodenumGET | POST | PUT | PATCH | DELETE.
urlstringEndpoint URL. May contain {{param}} placeholders substituted at call time.
headersobjectStatic headers map, e.g. { "Accept": "application/json" }.
body_templatestring | nullJSON string template for POST/PUT/PATCH bodies. Supports {{param}}.
parametersarraySee below.
authobjectType + header_name only. Credentials NEVER returned.
groupobject | nullUI grouping. { name, icon, color }.
created_atISO 8601Always UTC.
updated_atISO 8601Bumped on every PATCH.

Parameter shape

{
  "name": "ticket_id",
  "type": "string",
  "description": "Ticket ID to fetch.",
  "required": true,
  "in": "query" | "header" | "body",
  "headerName": "X-Ticket-Id"
}

Auth shape (read)

Reads return type + header_name only:

{ "type": "none" | "bearer" | "api_key" | "basic", "header_name": "X-API-Key" }

Auth shape (write input)

Writes accept credentials, encrypted at rest, never returned:

{
  "type": "api_key",
  "credentials": {
    "apiKey": "secret-here",
    "header_name": "X-API-Key"
  }
}
🔒
Credentials are write-only

Send auth.credentials on create/update. Read responses contain only the auth type and (for api_key) the header name. The secret itself is bcrypt-hashed and never returned.

© 2026 AGZ Technologies Private Limited