news-search
brave/brave-search-skills
Search news articles with freshness filtering, SafeSearch, and custom ranking via Goggles.
What is news-search?
Access Brave's news search API to retrieve current and historical news articles with metadata like publication date, thumbnails, and source profiles. Use freshness filters (past day/week/month/year or custom date ranges), SafeSearch controls, and Goggles for custom result ranking—ideal for breaking news monitoring, research, and multilingual news discovery.
- Search news articles by keyword with title, URL, description, age, and thumbnail metadata
- Filter by freshness (past 24 hours, week, month, year, or custom date range)
- Apply SafeSearch filtering (off/moderate/strict) to control adult content
- Use Goggles to custom-rank results by boosting trusted sources or discarding unwanted ones
- Support multilingual and multi-country searches with language and country parameters
- Retrieve up to 50 results per request with pagination and optional extra snippets
How to install news-search
npx skills add https://github.com/brave/brave-search-skills --skill news-search- Brave Search API key (get at https://api.search.brave.com)
- Active Search plan subscription (https://api-dashboard.search.brave.com/app/subscriptions/subscribe)
- HTTP client or SDK to call the REST endpoint
How to use news-search
- 1.Obtain a Brave Search API key and set it as BRAVE_SEARCH_API_KEY environment variable
- 2.Call GET or POST to https://api.search.brave.com/res/v1/news/search with your query parameter
- 3.Pass X-Subscription-Token header with your API key for authentication
- 4.Optionally add freshness parameter (pd/pw/pm/py or YYYY-MM-DDtoYYYY-MM-DD) to filter by time
- 5.Optionally apply Goggles URL or inline rules to custom-rank results by source
- 6.Parse the JSON response to extract article title, URL, description, age, thumbnail, and profile data
Use cases
- Monitor breaking news in real-time using 24-hour freshness filter for urgent topics
- Build custom news feeds by applying Goggles rules to boost trusted outlets and suppress low-quality sources
- Research historical news events by searching within specific date ranges
- Create multilingual news aggregators combining country, language, and UI language parameters
- Integrate news data into pipelines with fetch metadata timestamps for content freshness tracking
- News aggregators and monitoring platforms
- Researchers and journalists tracking stories over time
- Content teams building custom news feeds
- Data engineers building news pipelines
- Developers creating multilingual news applications
news-search FAQ
Both are supported. GET is simpler for basic queries, while POST is useful for long queries or complex Goggles rules that exceed URL length limits.
Write Goggles rules (e.g., `$discard\n$site=example.com,boost=3`) to boost trusted sources or discard unwanted ones. Host on GitHub/GitLab with required headers, or pass inline rules directly in the goggles parameter.
Yes. Use the country parameter (2-letter code or ALL) and search_lang parameter (2+ char language code) to target specific locales. ui_lang controls the UI language of the response.
Use pd (past day), pw (past week), pm (past month), py (past year), or a custom date range in YYYY-MM-DDtoYYYY-MM-DD format.
Yes. Use site:domain.com to limit results to a specific news outlet, "exact phrase" for exact matches, and -term to exclude terms. Operators are enabled by default; set operators=false to disable.
Full instructions (SKILL.md)
Source of truth, from brave/brave-search-skills.
name: news-search description: USE FOR news search. Returns news articles with title, URL, description, age, thumbnail, profile. Supports freshness and date range filtering, SafeSearch filter and Goggles for custom ranking.
News Search
Requires API Key: Get one at https://api.search.brave.com
Plan: Included in the Search plan. See https://api-dashboard.search.brave.com/app/subscriptions/subscribe
Quick Start (cURL)
Basic Search
curl -s "https://api.search.brave.com/res/v1/news/search?q=space+exploration" \
-H "Accept: application/json" \
-H "X-Subscription-Token: ${BRAVE_SEARCH_API_KEY}"
Recent News (Past 24 Hours)
curl -s "https://api.search.brave.com/res/v1/news/search" \
-H "Accept: application/json" \
-H "X-Subscription-Token: ${BRAVE_SEARCH_API_KEY}" \
-G \
--data-urlencode "q=cybersecurity" \
--data-urlencode "country=US" \
--data-urlencode "freshness=pd" \
--data-urlencode "count=20"
Date Range Filter
curl -s "https://api.search.brave.com/res/v1/news/search" \
-H "Accept: application/json" \
-H "X-Subscription-Token: ${BRAVE_SEARCH_API_KEY}" \
-G \
--data-urlencode "q=climate summit" \
--data-urlencode "freshness=2026-01-01to2026-01-31"
Endpoint
GET https://api.search.brave.com/res/v1/news/search
POST https://api.search.brave.com/res/v1/news/search
Authentication: X-Subscription-Token: <API_KEY> header
Note: Both GET and POST are supported. POST is useful for long queries or complex Goggles.
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
q | string | Yes | - | Search query (1-400 chars, max 50 words) |
country | string | No | US | Search country (2-letter country code or ALL) |
search_lang | string | No | en | Language preference (2+ char language code) |
ui_lang | string | No | en-US | UI language (e.g., "en-US") |
count | int | No | 20 | Number of results (1-50) |
offset | int | No | 0 | Page offset (0-9) |
safesearch | string | No | strict | Adult content filter (off/moderate/strict) |
freshness | string | No | - | Time filter (pd/pw/pm/py or date range) |
spellcheck | bool | No | true | Auto-correct query |
extra_snippets | bool | No | - | Up to 5 additional excerpts per result |
goggles | string or array | No | - | Custom ranking filter (URL or inline; repeat param for multiple) |
operators | bool | No | true | Apply search operators |
include_fetch_metadata | bool | No | false | Include fetch timestamps in results |
Freshness Values
| Value | Description |
|---|---|
pd | Past day (24 hours) - ideal for breaking news |
pw | Past week (7 days) |
pm | Past month (31 days) |
py | Past year (365 days) |
YYYY-MM-DDtoYYYY-MM-DD | Custom date range |
Response Format
{
"type": "news",
"query": {
"original": "space exploration"
},
"results": [
{
"type": "news_result",
"title": "New Developments in Space Exploration",
"url": "https://news.example.com/space-exploration",
"description": "Recent missions have advanced our understanding of...",
"age": "2 hours ago",
"page_age": "2026-01-15T14:30:00",
"page_fetched": "2026-01-15T15:00:00Z",
"meta_url": {
"scheme": "https",
"netloc": "news.example.com",
"hostname": "news.example.com",
"favicon": "https://imgs.search.brave.com/favicon/news.example.com",
"path": "/space-exploration"
},
"profile": {
"name": "Example Outlet",
"url": "https://news.example.com/space-exploration"
},
"thumbnail": {
"src": "https://imgs.search.brave.com/..."
}
}
]
}
Response Fields
| Field | Type | Description |
|---|---|---|
type | string | Always "news" |
query.original | string | The original search query |
query.altered | string? | Spellcheck-corrected query (if changed) |
query.cleaned | string? | Cleaned/normalized query from spellchecker |
query.spellcheck_off | bool? | Whether spellcheck was disabled |
query.show_strict_warning | bool? | True if strict safesearch blocked results |
query.search_operators | object? | Applied search operators |
query.search_operators.applied | bool | Whether operators were applied |
query.search_operators.cleaned_query | string? | Query after operator processing |
query.search_operators.sites | list[str]? | Domains from site: operators |
results[].type | string | Always "news_result" |
results[].title | string | Article title |
results[].url | string | Source URL of the article |
results[].description | string? | Article description/summary |
results[].age | string? | Human-readable age (e.g. "2 hours ago") |
results[].page_age | string? | Publication date from source (ISO datetime) |
results[].page_fetched | string? | When page was last fetched (ISO datetime) |
results[].fetched_content_timestamp | int? | Fetch timestamp (only with include_fetch_metadata=true) |
results[].meta_url.scheme | string? | URL protocol scheme |
results[].meta_url.netloc | string? | Network location |
results[].meta_url.hostname | string? | Lowercased domain name |
results[].meta_url.favicon | string? | Favicon URL |
results[].meta_url.path | string? | URL path |
results[].thumbnail.src | string | Served thumbnail URL |
results[].thumbnail.original | string? | Original thumbnail URL |
results[].extra_snippets | list[str]? | Up to 5 additional excerpts per result |
results[].profile.name | string? | Name of the site |
results[].profile.url | string? | The original URL where the profile is available |
results[].profile.long_name | string? | The long name of the site |
results[].profile.img | string? | The served image URL representing the profile |
Goggles (Custom Ranking) — Unique to Brave
Goggles let you re-rank news results — boost trusted outlets or suppress unwanted sources.
| Method | Example |
|---|---|
| Hosted | --data-urlencode "goggles=https://raw.githubusercontent.com/brave/goggles-quickstart/main/goggles/hacker_news.goggle" |
| Inline | --data-urlencode 'goggles=$discard\n$site=example.com' |
Hosted goggles must be on GitHub/GitLab, include
! name:,! description:,! author:headers, and be registered at https://search.brave.com/goggles/create. Inline rules need no registration.
Syntax: Rules start with $ + comma-separated options. Actions (pick one): discard, boost[=N], downrank[=N] — N is an integer 1–10. Site filter: site=DOMAIN. Example: $site=example.com,boost=3. Separate rules with \n (%0A).
Allow list: $discard\n$site=docs.python.org\n$site=developer.mozilla.org — Block list: $discard,site=pinterest.com\n$discard,site=quora.com
Resources: Discover · Syntax · Quickstart
Search Operators
Use search operators to refine results:
site:local-paper.com- Limit to specific news site"exact phrase"- Match exact phrase-exclude- Exclude term
Set operators=false to disable operator parsing.
Use Cases
- Breaking news monitoring: Use
freshness=pdfor the most recent articles on a topic. - Custom news feeds with Goggles: Boost trusted sources and discard other sources — unique to Brave.
- Historical news research: Use
freshness=YYYY-MM-DDtoYYYY-MM-DDto find articles from specific time periods. - Multilingual news: Combine
country,search_lang, andui_langfor cross-locale results. - Data pipelines: Set
include_fetch_metadata=trueforfetched_content_timestampon each result.
Notes
- SafeSearch: Defaults to
strict - Pagination: Use
offset(0-9) withcount - Extra snippets: Up to 5 additional excerpts when
extra_snippets=true
Related skills
More from brave/brave-search-skills and the wider catalog.

web-search
Web search API with ranked results, snippets, and rich metadata—use for data extraction and custom ranking.

images-search
Search for images with SafeSearch filtering and retrieve up to 200 results with metadata.

dingtalk-document
Manage DingTalk knowledge bases and documents—create, read, write, and control member access.

dingtalk-message
Send DingTalk messages via Webhook robots, enterprise apps, work notifications, and more.

crawl4ai
Use when scraping JavaScript-heavy pages or SPAs, crawling multiple URLs concurrently, extracting structured data with reusable CSS/JSON schemas, or building automated web data pipelines. Wraps the Crawl4AI library (`crwl` CLI and Python SDK) with schema-generation patterns for LLM-free extraction. Triggers on crawl4ai, crwl, scrape JS-heavy site, scrape SPA, headless browser scrape, schema-based extraction, batch crawl, sitemap crawl, web data pipeline. SKIP when a static HTML page can be read with `defuddle` / `fetch-web` — those are faster cold-start and don't need a browser.

agent-browser
Browser automation CLI for AI agents to navigate, interact with, and test websites programmatically.