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

# Public Search Tools

> Search the catalog without an account and get a trimmed tool shape

## Overview

Natural-language search over the catalog, with no account needed. The response is a reduced tool shape: no security schemes, base URL or credential details, so it is safe to serve to anyone. The dashboard's workflow builder uses it for tool discovery.

Ordering: an exact name or slug match is pinned first. Sample-data services (JSONPlaceholder, DummyJSON) are moved behind every real service unless the query names them. Deprecated tools stay listed until their sunset date passes; the flag and its reason let you avoid them.

When search could not run at all (a database timeout), the response is `503` with `Retry-After: 1`, so it is never mistaken for zero matches. Requests are limited to 30 per minute per IP address by default.

**Auth:** None required. Sending an API key (`danube-api-key` header) or a JWT changes only `readiness`: signed-in callers see which results they can run right now, and those are ranked first. Anonymous callers see no-auth tools as `ready` and everything else as `needs_credential`, in the catalog's own order.

## Query Parameters

<ParamField query="query" type="string" default="">
  What you are looking for. An empty or whitespace-only query returns an empty list.
</ParamField>

<ParamField query="service_id" type="string">
  Restrict results to one service
</ParamField>

<ParamField query="limit" type="integer" default={20}>
  Maximum results to return. The search itself never produces more than 30 matches.
</ParamField>

<ParamField query="ready_only" type="boolean" default={false}>
  Keep only tools whose `readiness` is `ready`. For an anonymous caller that means tools that need no credential. Applied before `limit`, so the page is not short.
</ParamField>

<ParamField query="min_success_rate" type="number">
  Between 0 and 1. Drops tools whose 30-day success rate is known and below the bar. Tools without a meaningful sample are kept, since unknown is not the same as bad.
</ParamField>

## Response

Returns an array of trimmed tool objects.

<ResponseField name="id" type="string">
  Tool UUID
</ResponseField>

<ResponseField name="name" type="string">
  Tool name
</ResponseField>

<ResponseField name="slug" type="string">
  Human-readable identifier, or `null`
</ResponseField>

<ResponseField name="description" type="string">
  Tool description
</ResponseField>

<ResponseField name="service_id" type="string">
  Parent service UUID
</ResponseField>

<ResponseField name="parameters" type="object">
  Keyed by parameter name. Each entry has `name`, `location`, `description`, `type` and `required`, plus `default`, `enum`, `minimum`, `maximum`, `encode_slashes` and `json_schema` when set.
</ResponseField>

<ResponseField name="readiness" type="string">
  `ready`, `needs_credential` or `unavailable` for this caller
</ResponseField>

<ResponseField name="configuration_url" type="string">
  Where to connect the service. Set only when `readiness` is `needs_credential`.
</ResponseField>

<ResponseField name="reliability" type="object">
  30-day reliability block, or `null` when the tool has not been called in the window. Keys: `window_days`, `calls_7d`, `calls_30d`, `success_rate_30d` (`null` below 10 calls), `p50_seconds`, `p95_seconds`, `last_success_at`, `last_failure_at`, `last_error_class`, `last_error_type`, `error_classes`, `faults`, `auth_failures_30d`, `caller_failures_30d`, `danube_failures_30d`, `upstream_failures_30d`, `distinct_callers_30d`, `flagged`, `refreshed_at`.
</ResponseField>

<ResponseField name="deprecated" type="boolean">
  Whether the tool is deprecated
</ResponseField>

<ResponseField name="deprecation_message" type="string">
  Why it was deprecated, or `null`
</ResponseField>

<ResponseField name="sunset_date" type="string">
  When a deprecated tool stops being listed, or `null`
</ResponseField>

## Example

The Python and TypeScript SDKs do not wrap this endpoint. Their `tools.search` methods call the authenticated [Search Tools](/api-reference/endpoint/search_tools) endpoint, as does the `search_tools` MCP tool.

<RequestExample>
  ```bash cURL theme={null}
  curl -X GET "https://api.danubeai.com/v1/tools/public/search?query=send%20email&limit=5&ready_only=true"
  ```
</RequestExample>

<ResponseExample>
  ```json theme={null}
  [
    {
      "id": "tool_abc123",
      "name": "Resend - Send Email",
      "slug": "resend-send-email",
      "description": "Send an email through Resend",
      "service_id": "svc_resend_001",
      "parameters": {
        "to": {
          "name": "to",
          "location": "body",
          "description": "Recipient address",
          "type": "string",
          "required": true
        },
        "subject": {
          "name": "subject",
          "location": "body",
          "description": "Subject line",
          "type": "string",
          "required": true
        }
      },
      "readiness": "needs_credential",
      "configuration_url": "/dashboard/services/svc_resend_001",
      "reliability": {
        "window_days": 30,
        "calls_7d": 4,
        "calls_30d": 18,
        "success_rate_30d": 1.0,
        "p50_seconds": 0.42,
        "p95_seconds": 0.9,
        "last_success_at": "2026-09-11T10:15:00Z",
        "last_failure_at": null,
        "last_error_class": null,
        "last_error_type": null,
        "error_classes": {},
        "faults": {},
        "auth_failures_30d": 0,
        "caller_failures_30d": 0,
        "danube_failures_30d": 0,
        "upstream_failures_30d": 0,
        "distinct_callers_30d": 2,
        "flagged": false,
        "refreshed_at": "2026-09-12T08:00:00Z"
      },
      "deprecated": false,
      "deprecation_message": null,
      "sunset_date": null
    }
  ]
  ```
</ResponseExample>
