DuckDuckGo Search API endpoint
Returns DuckDuckGo news results for a query string: title, destination URL, source, excerpt, thumbnail, and relative/published time, plus page-based pagination.
/duckduckgo/newsQuery parameters:
q (required) — the search query.page (optional) — 1-based page number. Defaults to 1.region (optional) — DuckDuckGo region/locale code, e.g. us-en,
uk-en, wt-wt (worldwide, DuckDuckGo's own default when omitted).Notable response behavior:
503.404.| Field | Filled in, of 27 checked | Values in the sample |
|---|---|---|
| position | 27 | 1 to 27, median 14 |
| title | 27 | median 69 characters |
| url | 27 | techcrunch.com and 15 other hosts |
| source | 27 | “TechCrunch” and 21 other values |
| excerpt | 27 | median 163 characters |
| thumbnail | 25 | techcrunch.com and 19 other hosts |
| relative_time | 27 | “5 days ago” and 13 other values |
| published_at | 27 | 2026-09-07 to 2026-10-13 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| q | string | Yes | Search query | openai | |
| page | integer | No | 1 | 1-based page number, defaults to 1 | 1 |
| region | string | No | DuckDuckGo region/locale code, e.g. us-en, uk-en, wt-wt (worldwide, the default) | us-en | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/duckduckgo/news?q=openai&page=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"query": "openai",
"results": [
{
"position": 1,
"title": "OpenAI announces new model",
"url": "https://example.com/openai-announces-new-model",
"source": "TechCrunch",
"excerpt": "OpenAI today announced...",
"thumbnail": "https://example.com/thumb.jpg",
"relative_time": "2 hours ago",
"published_at": 1721418540
}
],
"pagination": {
"page": 1,
"next_page": 2
}
}
}Request schema
No body schema
Response schema
#/definitions/duckduckgo.newsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | duckduckgo.NewsResponse | No | ||||
| data.pagination | duckduckgo.SearchPagination | No | ||||
| data.pagination.next_page | integer | No | 2 | |||
| data.pagination.page | integer | No | 1 | |||
| data.query | string | No | openai | |||
| data.results | array | No | ||||
| data.results[].excerpt | string | No | OpenAI today announced... | |||
| data.results[].position | integer | No | 1 | |||
| data.results[].published_at | integer | No | 1721418540 | |||
| data.results[].relative_time | string | No | 2 hours ago | |||
| data.results[].source | string | No | TechCrunch | |||
| data.results[].thumbnail | string | No | https://example.com/thumb.jpg | |||
| data.results[].title | string | No | OpenAI announces new model | |||
| data.results[].url | string | No | https://example.com/openai-announces-new-model | |||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 500 | Internal Server Error | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/duckduckgo/news?q=openai&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"