Journalists
Search journalist profiles by name. Each profile lists publishing outlets, a coverage summary of activity and subjects, and recent articles. Bylines with the same name are grouped in one profile.
Profiles use exact name matches. Different people with the same name, or generic bylines such as admin and Redaktion, may appear in one profile.
Full response field definitions are in API Response Structure. See also the Find journalists by topic recipe.
Endpoints
GET /v1/journalists # list & search
GET /v1/journalists/{id} # single journalist profileSend your API key in the X-API-Key header or api_key URL parameter.
List & search
GET /v1/journalistsQuery Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | No | Filter by journalist name (substring match). |
page | integer | No | Page number (default 1). |
per_page | integer | No | Results per page (default 100, max 250; the plan ceiling applies — Free 10, Starter 50, Basic 200). |
api_key | string | Yes* | Your API key. Can also be provided via headers. |
* Required if not provided in headers
Example
curl "https://api.apitube.io/v1/journalists?name=Alex&per_page=5&api_key=YOUR_API_KEY"
import requests
resp = requests.get(
"https://api.apitube.io/v1/journalists",
params={"name": "Alex", "per_page": 5, "api_key": "YOUR_API_KEY"},
)
print(resp.json())
const params = new URLSearchParams({ name: "Alex", per_page: "5", api_key: "YOUR_API_KEY" });
const resp = await fetch(`https://api.apitube.io/v1/journalists?${params}`);
console.log(await resp.json());
$query = http_build_query(["name" => "Alex", "per_page" => 5, "api_key" => "YOUR_API_KEY"]);
$data = json_decode(file_get_contents("https://api.apitube.io/v1/journalists?$query"), true);
print_r($data);
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
)
func main() {
u, _ := url.Parse("https://api.apitube.io/v1/journalists")
q := u.Query()
q.Set("name", "Alex")
q.Set("per_page", "5")
q.Set("api_key", "YOUR_API_KEY")
u.RawQuery = q.Encode()
resp, _ := http.Get(u.String())
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
var data map[string]any
json.Unmarshal(body, &data)
fmt.Println(data)
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.apitube.io/v1/journalists?name=Alex&per_page=5&api_key=YOUR_API_KEY"))
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
Write a script in your preferred language that calls the APITube News API:
GET https://api.apitube.io/v1/journalists?name=Alex&per_page=5
Read the API key from an environment variable (do not hardcode it), handle request
errors, and print the key fields of each result.
Docs: https://docs.apitube.io/platform/news-api/everything
{
"status": "ok",
"limit": 5,
"page": 1,
"has_next_pages": true,
"results": [
{
"id": 15898,
"name": "Alex Weiner",
"outlets": [
{ "id": 354, "name": "ktar.com", "domain": "ktar.com" },
{ "id": 1277, "name": "arizonasports.com", "domain": "arizonasports.com" }
],
"outlet_count": 2,
"links": {
"self": "https://api.apitube.io/v1/journalists/15898",
"articles": "https://api.apitube.io/v1/news/everything?author.id=15898"
}
}
]
}Journalist profile
GET /v1/journalists/{id}Returns a journalist with the outlets they publish under (merged by name, capped at 500 records), a coverage block, and recent_articles.
recent_articles contains the 5 latest articles, with all fields from /v1/news/everything, including body and entities. These fields can make the response large.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
coverage | string | No | Set to false to omit the coverage block. |
api_key | string | Yes* | Your API key. |
{
"id": 15898,
"name": "Alex Weiner",
"outlets": [
{ "id": 1277, "name": "arizonasports.com", "domain": "arizonasports.com" },
{ "id": 354, "name": "ktar.com", "domain": "ktar.com" }
],
"links": { "self": "...", "articles": "..." },
"coverage": {
"article_count": 265,
"first_seen": "2025-06-24",
"last_seen": "2026-05-22",
"sentiment": { "positive": 61, "neutral": 0, "negative": 30 },
"momentum": { "last_30_days": 0, "previous_30_days": 0, "change_pct": null },
"timeline": [ { "period": "2025-06-01", "count": 1 } ],
"top_topics": [ { "id": "industry.financial_news", "name": "Finance Industry News", "count": 91 } ],
"top_entities": [ { "id": 1480590, "name": "University of Arizona", "count": 248 } ],
"top_countries": [ { "id": 102, "name": "United States", "code": "us", "count": 265 } ],
"top_languages": [ { "id": 1, "name": "English", "code": "en", "count": 265 } ]
},
"recent_articles": [ { "id": 3074512345, "title": "...", "href": "...", "published_at": "...", "body": "...", "entities": [], "categories": [], "sentiment": {} } ]
}links.articles uses ?author.id=<this id> for one author record. A profile may group several records, so this link can return fewer articles than coverage.article_count. The author.id filter accepts at most three IDs, which may not cover every record in a profile.
author.name selects the first matching author record. Use coverage for profile totals and IDs from recent_articles to fetch the articles shown in the profile.
Coverage fields
| Field | Description |
|---|---|
article_count | Total articles across all author records with this name, up to 500 records. A journalist writing for three outlets may have three author IDs. The profile combines them, so this total can exceed the articles returned by links.articles. |
first_seen / last_seen | Date range of activity. |
sentiment | Article counts by overall polarity. |
momentum | Articles in the last 30 days vs. the previous 30 days. |
timeline | Monthly article counts. |
top_topics | Topics the journalist writes about most. |
top_entities | Entities (people, companies, places) the journalist covers most. |
top_countries / top_languages | Geographic and language spread of their articles. |
recent_articles | The journalist's latest articles. |
Pricing
Each request with results costs 1 point. Searches with no results are free. If you have no credits left, the API returns 402.
Errors
A request for a non-existent journalist returns 404 with code ER0151 (Journalist not found.).