# Keenable Web Search via ZeroClick

> Keenable Web Search via ZeroClick is a paid API for AI agents from zeroclick.keenable.ai, paid per call via MPP, price unknown, status unknown (last checked 2026-10-14).

Searches the web using Keenable's independent crawler and index, returning ranked results with titles, URLs, snippets, and publish/index dates, with optional site and date filters.

## Facts

- Endpoint: POST https://zeroclick.keenable.ai/v1/zeroclick/search?utm_source=zero.xyz
- Price: price unknown
- Payment: MPP
- Status: unknown
- Last checked: 2026-10-14
- Activations on Zero: 0
- Provider: zeroclick.keenable.ai
- Website: https://zeroclick.keenable.ai
- Canonical page: https://www.zero.xyz/c/zeroclick-keenable-ai-keenable-web-search-via-zeroclick-d4416adf
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_2ldYsAX6SicfNuzzG5mgE

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability zeroclick-keenable-ai-keenable-web-search-via-zeroclick-d4416adf -d '<json body>'
```

Example prompt: Search the web for the latest news about OpenAI's GPT-5 release, published after 2025-01-01, and return up to 15 results with full snippets up to 500 characters.

## When to prefer this

Choose this endpoint when you need independent web search with fine-grained date filtering (published_after, published_before, point-in-time query_time), site restriction, or experimental structured wizard outputs. It is ideal for AI agents needing autonomous, pay-per-use web search without an ongoing subscription, and when you want Keenable's own crawler index rather than a third-party search engine's results. Prefer this over the page fetch endpoint when you need ranked multi-result discovery rather than fetching a single known URL.

## Known failure modes

- Missing required 'query' field returns a 400 validation error
- query_time and published_after used together may produce confusing result sets since they interact differently
- max_results exceeding 50 is rejected with a validation error
- snippet_max_length below 180 or above 10000 is rejected
- Payment not completed or insufficient credits returns a 402 Payment Required
- enable_wizards used outside pro mode returns an error or is ignored
- Relative time strings in unsupported formats may be rejected or misinterpreted

## How this service works

Same search as POST /v1/search, bought through the Keenable storefront on ZeroClick. Also available as GET with the parameters in the query string.

## Output

Returns a JSON object containing the echoed query, mode used, and an array of results. Each result includes the page title, URL, a snippet (with query-relevant highlights), and optional published_at and acquired_at timestamps. If enable_wizards is true and a wizard matched, a wizards array with structured data (finance, sports, places, etc.) is also returned. A warning field appears if the query was treated as a URL fetch or site-only query.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "required": [
  "query"
 ],
 "properties": {
  "mode": {
   "enum": [
    "pro"
   ],
   "type": "string",
   "default": "pro",
   "description": "Retrieval mode; \"pro\" is the default"
  },
  "site": {
   "type": "string",
   "description": "Restrict results to a specific domain"
  },
  "query": {
   "type": "string",
   "description": "Search query"
  },
  "query_time": {
   "type": "string",
   "description": "Leave empty for a normal search. An upper time bound for a point-in-time search: the web as it stood at this moment, with every page newer than it excluded. It sets no lower bound, so this is not a recency filter; for recent results use published_after. Accepts an ISO 8601 datetime (e.g. \"2026-09-20T00:00:00Z\"), a YYYY-MM-DD date, a Unix epoch, or an offset back from now (\"7d\" means as of 7 days ago, not the last 7 days). Units: min, h, d, w, mo, y."
  },
  "max_results": {
   "type": "integer",
   "maximum": 50,
   "minimum": 1,
   "description": "Maximum number of results to return. When omitted, a default count (10) is used."
  },
  "acquired_after": {
   "type": "string",
   "description": "Filter: pages acquired after this date (YYYY-MM-DD, ISO 8601, or relative like \"7d\")"
  },
  "enable_wizards": {
   "type": "boolean",
   "default": false,
   "description": "Experimental: use wizards (structured data outputs). Only valid in \"pro\" mode."
  },
  "acquired_before": {
   "type": "string",
   "description": "Filter: pages acquired before this date"
  },
  "published_after": {
   "type": "string",
   "description": "Filter: pages published after this date, a lower bound on publish time. Use this, not query_time, to get recent results."
  },
  "published_before": {
   "type": "string",
   "description": "Filter: pages published before this date"
  },
  "snippet_max_length": {
   "type": "integer",
   "maximum": 10000,
   "minimum": 180,
   "description": "Maximum length, in characters, of the snippet returned per result. When omitted, a default snippet length is used."
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "object",
 "required": [
  "query",
  "mode",
  "results"
 ],
 "properties": {
  "mode": {
   "type": "string",
   "description": "Search mode used"
  },
  "query": {
   "type": "string",
   "description": "Echo of the search query"
  },
  "results": {
   "type": "array",
   "items": {
    "type": "object",
    "required": [
     "title",
     "url",
     "description"
    ],
    "properties": {
     "url": {
      "type": "string",
      "description": "Page URL"
     },
     "title": {
      "type": "string",
      "description": "Page title"
     },
     "snippet": {
      "type": "string",
      "description": "Search snippet with query-relevant highlights; falls back to the page description"
     },
     "acquired_at": {
      "type": "string",
      "description": "When the page was indexed (ISO 8601)"
     },
     "description": {
      "type": "string",
      "deprecated": true,
      "description": "Always empty. Deprecated — the page description now feeds the snippet fallback."
     },
     "published_at": {
      "type": "string",
      "description": "When the page was published (ISO 8601)"
     }
    }
   }
  },
  "warning": {
   "type": "string",
   "description": "Present when the request was not answered as a plain search. Either the query was a URL, so the page was fetched directly, or the query carried only a site: operator with no search terms, so the site name was used as the search term."
  },
  "wizards": {
   "type": "array",
   "items": {
    "type": "object",
    "required": [
     "wizard"
    ],
    "properties": {
     "wizard": {
      "type": "string",
      "description": "Wizard type, e.g. finance, sports, product_prices, prediction_markets, places, navigation"
     }
    },
    "additionalProperties": true
   },
   "description": "Experimental: structured data from wizards. Present only when enable_wizards is true and a wizard matched the query. The fields of each item depend on its wizard type."
  }
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/zeroclick-keenable-ai-keenable-web-search-via-zeroclick-d4416adf/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from zeroclick.keenable.ai](https://www.zero.xyz/host/zeroclick.keenable.ai/llms.txt)
