# List news

Search and filter stock news, press releases and legal notices, newest first.

`GET https://api.marketnewsapi.com/v1/news`

Returns articles matching every filter you pass. Filters combine with AND, and comma-separated values inside one filter are OR. Without filters you get the latest stock articles. Use `cursor` to page through results.

Requires an API key. See [authentication](/docs/authentication).

## Query parameters

- `tickers` (string) Comma-separated symbols, up to 50. Matches articles tagged with any of them, on every exchange. `MRVL` returns both the US stock and TSXV:MRVL. Example: `AAPL,MSFT`.
- `exchange` (string) Comma-separated exchange codes, such as `NASDAQ` or `TSXV`. With `tickers`, only those symbols on those exchanges match. Alone, any article with a listing on one of the exchanges. Example: `TSXV`.
- `category` (string) One or more categories, comma-separated. One of `stocks`.
- `type` (string) One or more of `news`, `press_release`, `legal`. Stock news is `category=stocks&type=news`. Press releases are `category=stocks&type=press_release`. Legal is `category=stocks&type=legal`. `stock_news` and `stockNews` mean stock news only. `pressRelease` means `press_release` and implies `category=stocks`. One of `news`, `press_release`, `legal`.
- `q` (string) Full-text search over title, summary and snippet. Use quotes for phrases: `"rate cut"`. Max 200 characters. Example: `"rate cut"`.
- `sources` (string) Only these publisher domains, comma-separated. Example: `globenewswire.com,businesswire.com`.
- `exclude_sources` (string) Drop these publisher domains, comma-separated.
- `from` (string) Earliest `published_at` (inclusive). ISO 8601 timestamp (`2026-10-06T13:30:00Z`) or date (`2026-10-06`). Dates are interpreted in UTC.
- `to` (string) Latest `published_at` (inclusive). ISO 8601 timestamp (`2026-10-06T13:30:00Z`) or date (`2026-10-06`). Dates are interpreted in UTC.
- `sort` (string) Result order. `relevance` only applies when `q` is set. Default: `published_desc`. One of `published_desc`, `published_asc`, `relevance`.
- `limit` (integer) Results per page, 1–100. Default: `20`.
- `cursor` (string) Opaque cursor from `meta.next_cursor` of the previous page.

## Example request

```curl
curl "https://api.marketnewsapi.com/v1/news?tickers=AAPL,MSFT&limit=10" \
 -H "Authorization: Bearer $MARKETNEWSAPI_KEY"
```

```python
import json
import os

import requests

resp = requests.get(
 "https://api.marketnewsapi.com/v1/news",
 params={"tickers": "AAPL,MSFT", "limit": 10},
 headers={"Authorization": f"Bearer {os.environ['MARKETNEWSAPI_KEY']}"},
 timeout=10,
)
resp.raise_for_status()
print(json.dumps(resp.json(), indent=2))
```

```javascript
const params = new URLSearchParams({ tickers: "AAPL,MSFT", limit: "10" });
const res = await fetch(`https://api.marketnewsapi.com/v1/news?${params}`, {
 headers: { Authorization: `Bearer ${process.env.MARKETNEWSAPI_KEY}` },
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
console.log(await res.json());
```

```go
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	req, _ := http.NewRequest("GET", "https://api.marketnewsapi.com/v1/news?tickers=AAPL,MSFT&limit=10", nil)
	req.Header.Set("Authorization", "Bearer "+os.Getenv("MARKETNEWSAPI_KEY"))

	res, err := http.DefaultClient.Do(req)
	if err != nil {
 panic(err)
	}
	defer res.Body.Close()

	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
```

```php
<?php
$query = http_build_query(['tickers' => 'AAPL,MSFT', 'limit' => 10]);
$ch = curl_init("https://api.marketnewsapi.com/v1/news?$query");
curl_setopt_array($ch, [
 CURLOPT_RETURNTRANSFER => true,
 CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('MARKETNEWSAPI_KEY')],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);

print_r($body);
```

```ruby
require "json"
require "net/http"

uri = URI("https://api.marketnewsapi.com/v1/news")
uri.query = URI.encode_www_form(tickers: "AAPL,MSFT", limit: 10)
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch('MARKETNEWSAPI_KEY')}"

res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
puts JSON.pretty_generate(JSON.parse(res.body))
```

```csharp
using System.Net.Http.Headers;

using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
 "Bearer", Environment.GetEnvironmentVariable("MARKETNEWSAPI_KEY"));

var json = await http.GetStringAsync("https://api.marketnewsapi.com/v1/news?tickers=AAPL,MSFT&limit=10");
Console.WriteLine(json);
```

```java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
 public static void main(String[] args) throws Exception {
 HttpRequest req = HttpRequest.newBuilder()
 .uri(URI.create("https://api.marketnewsapi.com/v1/news?tickers=AAPL,MSFT&limit=10"))
 .header("Authorization", "Bearer " + System.getenv("MARKETNEWSAPI_KEY"))
 .build();

 HttpResponse<String> res = HttpClient.newHttpClient()
 .send(req, HttpResponse.BodyHandlers.ofString());
 System.out.println(res.body());
 }
}
```

## Example response

200 OK

```json
{
 "data": [
 {
 "id": "art_9f2c1d7e4b8a6035",
 "title": "Apple unveils new on-device AI features, shares rise in premarket trading",
 "url": "https://www.example-publisher.com/markets/apple-ai-features",
 "source": {
 "name": "Example Publisher",
 "domain": "example-publisher.com"
 },
 "publisher": "Example Publisher",
 "published_at": "2026-10-06T12:31:04Z",
 "ingested_at": "2026-10-06T12:31:09Z",
 "category": "stocks",
 "type": "news",
 "tickers": [
 "AAPL"
 ],
 "listings": [
 {
 "symbol": "AAPL",
 "exchange": "NASDAQ"
 }
 ],
 "snippet": "Apple on Tuesday introduced a set of on-device AI features for iPhone and Mac, sending the stock higher before the open.",
 "summary": "Apple announced new on-device AI features for iPhone and Mac. Shares rose about 2% in premarket trading as analysts called the update a catalyst for the upgrade cycle.",
 "body": null,
 "entities": [
 {
 "type": "company",
 "name": "Apple Inc.",
 "symbol": "AAPL"
 },
 {
 "type": "product",
 "name": "iPhone"
 }
 ],
 "language": "en"
 }
 ],
 "meta": {
 "count": 1,
 "next_cursor": "eyJ0IjoxNzU5NzUzODY0MDAwLCJpIjoiYXJ0XzlmMmMxZDdlNGI4YTYwMzUifQ",
 "plan": "stream",
 "delayed_minutes": 0
 }
}
```

## Try it

## Errors

This endpoint returns the standard [error format](/docs/errors). The most common errors are `400 invalid_parameter`, `401 invalid_api_key` and `429 daily_limit_reached` (Free plan).
