How to Find Journalists by Byline and Beat
Search the journalists directory with /v1/journalists, then open a profile for outlets, coverage stats and recent articles
Written by Tasha Tatum
August 23, 2026
How to find journalists by byline and beat
To look up reporters, call GET /v1/journalists to search the directory by name, then call GET /v1/journalists/:id to open a single profile with the journalist’s outlets, coverage statistics and most recent articles. The directory normalizes bylines by name, so the same reporter writing for several outlets is merged into one record with an outlets array.
curl "https://api.apitube.io/v1/journalists?name=Jane%20Doe&api_key=YOUR_API_KEY"
Send the key as the X-API-Key header instead of the api_key query parameter if you prefer. With no name, the endpoint returns the full directory page by page.
How to search the journalists directory
GET /v1/journalists lists journalists and accepts a name filter that does a partial (substring) match, so name=Jane returns every byline containing “Jane”. Paginate with page (default 1) and per_page (default 100). The per_page ceiling depends on your plan — 10 on Free, 50 on Starter, 200 on Basic, 250 on Professional and Corporate — and asking for more returns HTTP 400 with error ER0171, whose message names the limit that applies to your key; a non-numeric page returns ER0172 and a non-numeric per_page returns ER0170.
curl "https://api.apitube.io/v1/journalists?name=climate&per_page=50&page=2&api_key=YOUR_API_KEY"
The list response wraps the matches and tells you whether more pages exist:
{
"status": "ok",
"limit": 100,
"page": 1,
"has_next_pages": true,
"results": [
{
"id": 84213,
"name": "Jane Doe",
"outlets": [
{ "id": 512, "name": "The Verge", "domain": "theverge.com" }
],
"outlet_count": 2,
"links": {
"self": "https://api.apitube.io/v1/journalists/84213",
"articles": "https://api.apitube.io/v1/news/everything?author.id=84213"
}
}
]
}
has_next_pages is true only when a further record actually exists: the endpoint asks the database for per_page + 1 rows and reports the extra one without returning it, so a page that comes back exactly full still reads false when nothing follows it. outlet_count is the number of outlet records merged into that journalist and appears on the list endpoint only. The links.articles URL is ready to use, but read it precisely: it filters by one author.id — the record you opened — while coverage.article_count on the profile counts every record merged under that name. A reporter published across three outlets has three author records, so the link returns a subset: for author 570 the profile reports 412 articles and author.id=570 matches 191. author.name does not solve it either — it resolves to a single record too. Use coverage for the totals and author.id when you need one exact byline — see how to filter news by author.
What is in a journalist profile?
GET /v1/journalists/:id returns one journalist’s id, name, the outlets they publish under (each with id, name and domain), a links block, a coverage summary, and recent_articles — up to five full article objects. A missing ID returns HTTP 404 with error ER0151.
curl "https://api.apitube.io/v1/journalists/84213?api_key=YOUR_API_KEY"
The coverage block aggregates everything that journalist has written:
{
"coverage": {
"article_count": 1284,
"first_seen": "2023-02-11",
"last_seen": "2026-06-25",
"sentiment": { "positive": 540, "neutral": 612, "negative": 132 },
"momentum": { "last_30_days": 41, "previous_30_days": 37, "change_pct": 11 },
"timeline": [ { "period": "2026-06-01", "count": 41 } ],
"top_topics": [ { "id": 123, "name": "Artificial Intelligence", "count": 88 } ],
"top_entities": [ { "id": 314, "name": "OpenAI", "count": 57 } ],
"top_countries": [ { "id": 840, "name": "United States", "code": "us", "count": 700 } ],
"top_languages": [ { "id": 1, "name": "English", "code": "en", "count": 1200 } ]
}
}
That is how you read a reporter’s beat: top_topics and top_entities show what they cover most, momentum compares the last 30 days against the previous 30 (change_pct is null when there is no prior activity to compare), and timeline breaks output down by month. Use top_entities the same way you would the article-level entity filter — see how to find news mentioning a person or company.
How to skip the coverage block
Coverage runs several aggregate queries, so when you only need the name, outlets and links, add coverage=false to skip it and get a lighter, faster response:
curl "https://api.apitube.io/v1/journalists/84213?coverage=false&api_key=YOUR_API_KEY"
With coverage=false the profile omits the coverage object while still returning recent_articles.
Common Questions
- How are journalists with the same name handled?
- How do I get every article a journalist wrote?
- Does each directory call count as a request?
- Why are the article bodies in recent_articles cut off?
How are journalists with the same name handled?
The directory merges records by exact name, so one reporter publishing across multiple outlets becomes a single profile with an outlets array. The trade-off is that true namesakes — two different people who share a name — and generic bylines such as “admin” can be merged into one profile. Finer disambiguation is planned for a later release. When you need a precise scope, filter the actual articles by author.id, which targets a single byline record.
How do I get every article a journalist wrote?
Take the id from the directory and pass it to the search endpoint as author.id, exactly the URL given in links.articles: GET /v1/news/everything?author.id=84213. The author.id filter accepts up to three IDs separated by commas with OR logic, so you can pull several bylines at once and combine them with any other search filter.
Does each directory call count as a request?
Yes — a successful /v1/journalists or /v1/journalists/:id call charges one request against your plan. The list endpoint is the exception that helps you: if a search returns zero matches, no request is charged.
Why are the article bodies in recent_articles cut off?
On a free plan or a test key, the article bodies inside recent_articles are truncated to a preview, the same masking applied across the News API. Use a live key on a paid plan to receive the full text. For the complete list of accepted parameters and values, see the official parameters reference.