281 lines
6.2 KiB
Markdown
281 lines
6.2 KiB
Markdown
# PolySearch API
|
||
|
||
A search API for AI agents. Submit queries, get structured results. Supports single and batch requests.
|
||
|
||
**Base URL:** `http://<host>:9876`
|
||
|
||
**Auth:** All endpoints except `/health` require a Bearer token.
|
||
|
||
```http
|
||
Authorization: Bearer <api_key>
|
||
```
|
||
|
||
---
|
||
|
||
## Quick reference
|
||
|
||
| Endpoint | Method | Auth | Purpose |
|
||
|----------|--------|------|---------|
|
||
| `/health` | GET | No | Ping the server |
|
||
| `/search` | POST | Yes | One query, one response |
|
||
| `/batch` | POST | Yes | Multiple queries, one response |
|
||
| `/metrics` | GET | Yes | Proxy pool health and usage |
|
||
|
||
---
|
||
|
||
## Authentication
|
||
|
||
The server operator provides an API key. Include it in every request (except `/health`):
|
||
|
||
```bash
|
||
curl -H "Authorization: Bearer <key>" http://localhost:9876/search ...
|
||
```
|
||
|
||
---
|
||
|
||
## `GET /health`
|
||
|
||
Check if the server is running.
|
||
|
||
```bash
|
||
curl http://localhost:9876/health
|
||
```
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"status": "ok",
|
||
"uptime": 42.5,
|
||
"proxyPool": {
|
||
"total": 11,
|
||
"alive": 11,
|
||
"dead": 0,
|
||
"requestsTotal": 47,
|
||
"successRate": "91.5%",
|
||
"hourlyUsage": 12
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## `POST /search`
|
||
|
||
Single search. Returns either image results, web results, or both.
|
||
|
||
```bash
|
||
curl -X POST http://localhost:9876/search \
|
||
-H "Authorization: Bearer <key>" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"query": "mars rover", "type": "image", "limit": 3}'
|
||
```
|
||
|
||
### Request
|
||
|
||
| Field | Type | Required | Default | Description |
|
||
|-------|------|----------|---------|-------------|
|
||
| `query` | string | yes | — | What to search for |
|
||
| `type` | string | no | `image` | `image`, `web`, or `both` |
|
||
| `limit` | number | no | `10` | Max results per type (1–50) |
|
||
|
||
### Response — Image results
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"query": "mars rover",
|
||
"type": "image",
|
||
"execution_time_ms": 3200,
|
||
"image": {
|
||
"engine": "duckduckgo",
|
||
"total": 3,
|
||
"results": [
|
||
{
|
||
"index": 1,
|
||
"title": "NASA Perseverance Rover's Stunning Find...",
|
||
"image_url": "https://scitechdaily.com/images/...jpg",
|
||
"source_url": "https://scitechdaily.com/...",
|
||
"domain": "scitechdaily.com",
|
||
"width": 2560,
|
||
"height": 1818,
|
||
"thumbnail": "https://tse4.mm.bing.net/th?id=...",
|
||
"engine": "duckduckgo"
|
||
}
|
||
],
|
||
"statistics": {
|
||
"avg_width": 3200,
|
||
"avg_height": 1989,
|
||
"domains": {
|
||
"scitechdaily.com": 1,
|
||
"static1.simpleflyingimages.com": 2
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
Each image result contains:
|
||
|
||
| Field | Type | Description |
|
||
|-------|------|-------------|
|
||
| `title` | string | Image description or caption |
|
||
| `image_url` | string | Direct URL to the image file |
|
||
| `source_url` | string | Page the image was found on |
|
||
| `domain` | string | Hosting domain |
|
||
| `width` | number | Image width (pixels) |
|
||
| `height` | number | Image height (pixels) |
|
||
| `thumbnail` | string | Thumbnail URL |
|
||
| `engine` | string | Search engine used |
|
||
|
||
### Response — Web results
|
||
|
||
When `type` is `web` or `both`:
|
||
|
||
```json
|
||
{
|
||
"web": {
|
||
"engine": "duckduckgo",
|
||
"total": 3,
|
||
"results": [
|
||
{
|
||
"index": 1,
|
||
"title": "Quantum computing - Wikipedia",
|
||
"url": "https://en.wikipedia.org/wiki/Quantum_computing",
|
||
"domain": "en.wikipedia.org",
|
||
"snippet": "A quantum computer is a computer that exploits quantum mechanical phenomena...",
|
||
"engine": "duckduckgo"
|
||
}
|
||
],
|
||
"statistics": {
|
||
"domains": {
|
||
"en.wikipedia.org": 1
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### Response — Error
|
||
|
||
```json
|
||
{
|
||
"success": false,
|
||
"error": {
|
||
"code": "ENGINE_FAILED",
|
||
"message": "All search engines returned errors",
|
||
"type": "Error"
|
||
},
|
||
"query": "obscure term",
|
||
"timestamp": "2026-06-05T10:55:25.088Z"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## `POST /batch`
|
||
|
||
Run 2–50 queries in a single request. Queries execute concurrently. Results return when all are complete.
|
||
|
||
```bash
|
||
curl -X POST http://localhost:9876/batch \
|
||
-H "Authorization: Bearer <key>" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"queries": [
|
||
{"query": "vintage radio", "type": "image", "limit": 2},
|
||
{"query": "mars rover", "type": "image", "limit": 2},
|
||
{"query": "aurora borealis","type": "image", "limit": 2}
|
||
]
|
||
}'
|
||
```
|
||
|
||
### Request
|
||
|
||
| Field | Type | Required | Description |
|
||
|-------|------|----------|-------------|
|
||
| `queries` | array | yes | 2–50 query objects |
|
||
|
||
Each query object:
|
||
|
||
| Field | Type | Required | Default | Description |
|
||
|-------|------|----------|---------|-------------|
|
||
| `query` | string | yes | — | Search term |
|
||
| `type` | string | no | `image` | `image`, `web`, or `both` |
|
||
| `limit` | number | no | `10` | Max results per type |
|
||
|
||
### Response
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"batch_size": 3,
|
||
"execution_time_ms": 4511,
|
||
"ok": 3,
|
||
"fail": 0,
|
||
"results": [
|
||
{
|
||
"index": 0,
|
||
"query": "vintage radio",
|
||
"type": "image",
|
||
"success": true,
|
||
"execution_time_ms": 4313,
|
||
"results": { ... full search response ... },
|
||
"errors": []
|
||
}
|
||
],
|
||
"metrics": {
|
||
"hourly_usage": 7
|
||
}
|
||
}
|
||
```
|
||
|
||
Each result mirrors the single `/search` response. Failed queries include an `error` field instead of `results`.
|
||
|
||
Use `batch_size` to verify all queries were accepted, and `ok` / `fail` for a quick success count.
|
||
|
||
---
|
||
|
||
## `GET /metrics`
|
||
|
||
Proxy pool statistics. Useful for monitoring health and utilization.
|
||
|
||
```bash
|
||
curl -H "Authorization: Bearer <key>" http://localhost:9876/metrics
|
||
```
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"metrics": {
|
||
"totalProxies": 11,
|
||
"alive": 11,
|
||
"dead": 0,
|
||
"circuitOpen": 0,
|
||
"requestsTotal": 47,
|
||
"successTotal": 43,
|
||
"failureTotal": 4,
|
||
"successRate": "91.5%",
|
||
"hourlyUsageCurrent": 12,
|
||
"byProvider": {
|
||
"webshare": {
|
||
"proxyCount": 10,
|
||
"alive": 10,
|
||
"requests": 47,
|
||
"success": 43,
|
||
"failure": 4,
|
||
"avgLatencyMs": 3604,
|
||
"successRate": "91.5%",
|
||
"hourlyUsage": { "currentHour": 12 }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Notes
|
||
|
||
- **Rate limits** depend on the proxy provider. The system distributes requests evenly and opens circuit breakers when proxies fail repeatedly.
|
||
- **Timeouts** vary. Image searches typically take 2–15 seconds depending on query and network conditions.
|
||
- **Max batch size** is 50 queries per request.
|