> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getsales.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Test custom tool

> Execute the tool FOR REAL with the given params, through the same executor a production call takes: one HTTP call to the target, logged as a provider_calls row (source_service api, tool_type custom_tool), 0 credits, a fresh idempotency key per press. result carries the outcome verbatim: status, output {status, body, extracted}, the classified error_code and a message that opens with the token of a tool-level failure (custom_tool_disabled, input_binding...), and provider_call_sid for the snapshots. Use it to see what a column would get, or why a tool returns nothing (compare output.body with output_mapping). A dry-run that does not hit the target would validate nothing. Throttled 10 a minute.

Contract:
- MCP tool `test_custom_tool`, registry package `mcp.integrations/custom_tools`, mount `integrations.providers`.
- Operation `action`, response envelope `action`.
- Flags: none.



## OpenAPI

````yaml /api-reference/integrations/openapi.yaml post /api/custom-tools/{sid}/test
openapi: 3.0.3
info:
  title: 'GetSales public contract: gs.service.integrations'
  description: >-
    The integrations service: the integration platform (the team's credentials
    for its own APIs and its CRM grants, the HTTP tools it defines over them,
    the execution log and the priced catalog of every outbound provider call)
    and the event plane (the platform-wide webhook subscriptions and the
    delivery state of each event).


    GENERATED. This document is projected from the Zod MCP tool registry in
    `product/mcp/gs.mcp` (one tool per public endpoint, 1:1). Do not edit it by
    hand; edit the tool definition and regenerate with `pnpm openapi:public`.


    Surface: the public `/api` contract of `gs.service.integrations`, 26
    operations. This is the only OpenAPI document the platform publishes.
    Internal (`/internal`) and health endpoints are deliberately absent: they
    are not part of any contract, they can change without notice, and the
    service source is their only description.


    Conventions:

    - Auth is a bearer JWT, optionally narrowed by the `Team-SID` header.

    - Every success body is an MCP envelope: `success: true` plus one typed
    `operation` shape (`search`, `get`, `create`, `update`, `delete`, `metrics`,
    `group_by`, `action`), and a `meta` block with `trace_id` for support.

    - Every failure is the same `McpError` envelope with a code from a fixed
    16-code taxonomy, so a client maps errors once.

    - Lists page with `page_size` (0 to 500, default 50) plus an opaque forward
    `cursor`; `page_size: 0` returns counts only.

    - On `GET` and `DELETE`, object-valued query parameters (`filter`, `sort`)
    travel as JSON text and array-valued ones repeat as `name[]=value`.

    - The MCP-only `_meta` field (usage analytics) never reaches the backend and
    is not part of this contract.
  version: '1.0'
  contact:
    name: GetSales
    url: https://getsales.io
    email: support@getsales.io
  license:
    name: Proprietary
    url: https://getsales.io/terms
servers:
  - url: https://beta.getsales.io/integrations/v1
    description: >-
      Production (the gateway path on the beta ring; the origin is provisioned
      per DEPLOY_MAP.md)
security:
  - BearerJwt: []
    TeamSid: []
tags:
  - name: custom_tools
    description: >-
      Registry package `mcp.integrations/custom_tools`, served on MCP mount
      `integrations.providers`.
  - name: provider_calls
    description: >-
      Registry package `mcp.integrations/provider_calls`, served on MCP mount
      `integrations.providers`.
  - name: provider_connections
    description: >-
      Registry package `mcp.integrations/provider_connections`, served on MCP
      mount `integrations.providers`.
  - name: webhook_logs
    description: >-
      Registry package `mcp.integrations/webhook_logs`, served on MCP mount
      `integrations.webhooks`.
  - name: webhooks
    description: >-
      Registry package `mcp.integrations/webhooks`, served on MCP mount
      `integrations.webhooks`.
paths:
  /api/custom-tools/{sid}/test:
    post:
      tags:
        - custom_tools
      summary: Test custom tool
      description: >-
        Execute the tool FOR REAL with the given params, through the same
        executor a production call takes: one HTTP call to the target, logged as
        a provider_calls row (source_service api, tool_type custom_tool), 0
        credits, a fresh idempotency key per press. result carries the outcome
        verbatim: status, output {status, body, extracted}, the classified
        error_code and a message that opens with the token of a tool-level
        failure (custom_tool_disabled, input_binding...), and provider_call_sid
        for the snapshots. Use it to see what a column would get, or why a tool
        returns nothing (compare output.body with output_mapping). A dry-run
        that does not hit the target would validate nothing. Throttled 10 a
        minute.


        Contract:

        - MCP tool `test_custom_tool`, registry package
        `mcp.integrations/custom_tools`, mount `integrations.providers`.

        - Operation `action`, response envelope `action`.

        - Flags: none.
      operationId: test_custom_tool
      parameters:
        - name: sid
          in: path
          required: true
          description: Custom tool sid (in_tl_...).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^in_tl_
            description: Custom tool sid (in_tl_...).
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TestCustomToolRequest'
      responses:
        '200':
          description: '`action` success envelope.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TestCustomToolResponse'
        4XX:
          $ref: '#/components/responses/McpClientError'
        5XX:
          $ref: '#/components/responses/McpServerError'
components:
  schemas:
    TestCustomToolRequest:
      type: object
      description: Request body of `test_custom_tool`.
      properties:
        params:
          type: object
          additionalProperties:
            anyOf:
              - type: string
              - type: number
              - type: boolean
          description: >-
            The inputs by key, bound against input_schema (a missing required
            one fails the row).
    TestCustomToolResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - action
        action:
          type: string
          description: kebab-case verb; matches the route segment.
        item:
          type: object
          nullable: true
          properties:
            sid:
              type: string
              description: Custom tool sid (in_tl_...).
            team_sid:
              type: string
              description: The owning workspace (ts_tm_...).
            name:
              type: string
              description: >-
                Unique within the team among live rows; what the tool pickers
                show.
            description:
              type: string
              nullable: true
              description: Free text, up to 2000 chars.
            provider_connection_sid:
              type: string
              nullable: true
              description: >-
                The connection the tool authenticates with (in_cn_...); null =
                no auth.
            request:
              type: object
              properties:
                method:
                  type: string
                  enum:
                    - GET
                    - POST
                    - PUT
                    - PATCH
                    - DELETE
                  description: The HTTP method.
                url:
                  type: string
                  maxLength: 2048
                  pattern: ^https:\/\/
                  description: >-
                    https URL; scheme and host literal (no placeholders, default
                    port, public DNS), placeholders in the path and query only.
                headers:
                  type: object
                  additionalProperties:
                    type: string
                    maxLength: 1024
                  description: >-
                    Up to 20 headers; values may hold placeholders. Auth-shaped
                    names (authorization, cookie, token, key...) and
                    Content-Type are refused: auth comes from the connection.
                body:
                  type: object
                  nullable: true
                  additionalProperties: {}
                  description: >-
                    A JSON template; null on GET and DELETE. String leaves may
                    hold placeholders; a leaf that IS {{key}} renders with the
                    input's native type.
              required:
                - method
                - url
              description: The request template.
            input_schema:
              type: array
              items:
                type: object
                properties:
                  key:
                    type: string
                    description: The placeholder name.
                  type:
                    type: string
                    description: string | number | boolean.
                  required:
                    type: boolean
                    description: Whether a call must bind it.
                required:
                  - key
                  - type
                  - required
              description: The declared inputs (up to 30).
            output_mapping:
              type: object
              additionalProperties:
                type: string
              description: >-
                name to dot-path into the response body (up to 20); {} = the raw
                body only.
            status:
              type: string
              enum:
                - 'on'
                - 'off'
              description: >-
                off = the executor refuses it with a failed row
                (custom_tool_disabled).
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: >-
                    The OAuth client that acted ("Claude", "n8n"); null for a
                    user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: >-
                    Why a system actor wrote the row (snapshot_capture_job,
                    ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: >-
                    Internal audit context: the grant set the actor held at
                    write time. Not a contract.
                cluster_id:
                  type: integer
                  nullable: true
                  description: 'Internal audit context: the cluster that served the write.'
                trace_id:
                  type: string
                  nullable: true
                  description: >-
                    Internal audit context: the trace id of the request that
                    wrote the row.
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
              description: Who defined the tool.
            deleted_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: >-
                    The OAuth client that acted ("Claude", "n8n"); null for a
                    user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: >-
                    Why a system actor wrote the row (snapshot_capture_job,
                    ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: >-
                    Internal audit context: the grant set the actor held at
                    write time. Not a contract.
                cluster_id:
                  type: integer
                  nullable: true
                  description: 'Internal audit context: the cluster that served the write.'
                trace_id:
                  type: string
                  nullable: true
                  description: >-
                    Internal audit context: the trace id of the request that
                    wrote the row.
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
              description: Who deleted it; null while live.
            created_at:
              type: string
              description: ISO 8601 UTC.
            updated_at:
              type: string
              description: ISO 8601 UTC.
            deleted_at:
              type: string
              nullable: true
              description: ISO 8601 UTC; null = live.
          required:
            - sid
            - team_sid
            - name
            - description
            - provider_connection_sid
            - request
            - input_schema
            - output_mapping
            - status
            - created_by
            - deleted_by
            - created_at
            - updated_at
            - deleted_at
        result:
          type: object
          properties:
            status:
              type: string
              description: 'success | failed: the execute outcome.'
            output:
              type: object
              nullable: true
              additionalProperties: {}
              description: >-
                {status, body (capped), extracted} of the real call; null on a
                failure before the call.
            error_code:
              type: string
              nullable: true
              enum:
                - auth_error
                - rate_limited
                - timeout
                - network_error
                - invalid_input
                - provider_error
                - not_found
              description: The executor's classified code; null on success.
            error_message:
              type: string
              nullable: true
              description: >-
                Opens with the branchable token on a tool-level failure
                (custom_tool_disabled, input_binding...).
            credits_charged:
              type: number
              description: Always 0 for http.request.
            cache_hit:
              type: boolean
              description: 'Always false: http.request is never cached.'
            provider_call_sid:
              type: string
              description: >-
                The logged row (in_pc_...): get_provider_call reads the
                snapshots.
          required:
            - status
            - output
            - error_code
            - error_message
            - credits_charged
            - cache_hit
            - provider_call_sid
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              description: >-
                The team this call ran in (the token team, or the team_sid
                override). Null when unauthenticated; absent from pre-2026-08-20
                backends.
            actor_type:
              type: string
              nullable: true
              description: >-
                user | agent | api_key | system. Null when unauthenticated;
                absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
      required:
        - success
        - operation
        - action
        - item
        - result
        - meta
    McpError:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - false
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - validation_failed
                - nothing_to_update
                - not_found
                - relation_not_found
                - invalid_transition
                - limit_exceeded
                - payment_required
                - duplicate_rejected
                - conflict
                - delete_blocked
                - unauthorized
                - forbidden
                - rate_limited
                - internal_error
                - service_unavailable
                - not_implemented
            message:
              type: string
            recoverable:
              type: boolean
            suggestion:
              type: string
            field_errors:
              type: object
              additionalProperties:
                type: array
                items:
                  type: object
                  properties:
                    rule:
                      type: string
                    message:
                      type: string
                  required:
                    - rule
                    - message
            blockers:
              type: array
              items:
                type: object
                properties:
                  type:
                    type: string
                    description: >-
                      Machine-readable blocker type (active_flow, pending_tasks,
                      …).
                  severity:
                    type: string
                    enum:
                      - hard
                      - soft
                    description: >-
                      hard = external action required; soft = acknowledge is
                      enough.
                  description:
                    type: string
                  entity_sid:
                    type: string
                    nullable: true
                  count:
                    type: integer
                  resolution:
                    type: string
                    description: 'Hard: tool name to call. Soft: code for acknowledge[].'
                  resolution_hint:
                    type: string
                required:
                  - type
                  - severity
                  - description
                  - entity_sid
                  - resolution
                  - resolution_hint
            context:
              type: object
              additionalProperties: {}
          required:
            - code
            - message
            - recoverable
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              description: >-
                The team this call ran in (the token team, or the team_sid
                override). Null when unauthenticated; absent from pre-2026-08-20
                backends.
            actor_type:
              type: string
              nullable: true
              description: >-
                user | agent | api_key | system. Null when unauthenticated;
                absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
      required:
        - success
        - error
  responses:
    McpClientError:
      description: >-
        MCP error envelope. `error.code` is one of validation_failed,
        nothing_to_update, not_found, relation_not_found, invalid_transition,
        limit_exceeded, payment_required, duplicate_rejected, conflict,
        delete_blocked, unauthorized, forbidden, rate_limited, not_implemented.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/McpError'
    McpServerError:
      description: >-
        MCP error envelope with `error.code` internal_error or
        service_unavailable.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/McpError'
  securitySchemes:
    BearerJwt:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Access token issued by gs.service.id. Its `access_identity` claim
        carries `team_sid`, `actor_sid` and `actor_type`, and that team scope is
        authoritative.
    TeamSid:
      type: apiKey
      in: header
      name: Team-SID
      description: >-
        Team scope for tokens that do not carry one. Ignored when the token
        already names a team.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.