People
Search profiles of public figures, politicians and executives. Each profile includes background details, a coverage summary and recent articles about the person.
Sign up at APITube to get your API key. Include it with every API request.
Full response field definitions are in API Response Structure. See also the Build a public figure profile recipe.
Endpoints
GET /v1/people # list & search
GET /v1/people/{id} # single person profileSend your API key in the X-API-Key header or api_key URL parameter.
List & search
GET /v1/peopleQuery Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | No | Filter by person name (substring match). |
wikidata_id | string | No | Filter by Wikidata ID (e.g. Q317521 or 317521). |
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/people?name=Obama&per_page=5&api_key=YOUR_API_KEY"
import requests
resp = requests.get(
"https://api.apitube.io/v1/people",
params={"name": "Obama", "per_page": 5, "api_key": "YOUR_API_KEY"},
)
print(resp.json())
const params = new URLSearchParams({ name: "Obama", per_page: "5", api_key: "YOUR_API_KEY" });
const resp = await fetch(`https://api.apitube.io/v1/people?${params}`);
console.log(await resp.json());
$query = http_build_query(["name" => "Obama", "per_page" => 5, "api_key" => "YOUR_API_KEY"]);
$data = json_decode(file_get_contents("https://api.apitube.io/v1/people?$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/people")
q := u.Query()
q.Set("name", "Obama")
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/people?name=Obama&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/people?name=Obama&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": 1316868,
"name": "Michelle Obama",
"type": "person",
"links": {
"self": "https://api.apitube.io/v1/people/1316868",
"articles": "https://api.apitube.io/v1/news/entity/1316868",
"wikipedia": "https://en.wikipedia.org/wiki/Michelle_Obama",
"wikidata": "https://www.wikidata.org/wiki/Q13133"
},
"profile": {
"title": "attorney at law",
"gender": "female",
"nationality": "United States",
"date_of_birth": "1964-01-17",
"social_profiles": { "twitter": "https://twitter.com/MichelleObama" }
}
}
]
}Person profile
GET /v1/people/{id}Get one person's full profile, news coverage and recent_articles.
recent_articles contains the 5 latest articles about the person. Each includes the full article fields from /v1/news/everything, including body, body_html and entities, so responses can be large. coverage=false removes only the coverage summary.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
coverage | string | No | Set to false to omit the coverage block (faster response). |
api_key | string | Yes* | Your API key. |
Example
curl "https://api.apitube.io/v1/people/1316868?api_key=YOUR_API_KEY"
import requests
resp = requests.get(
"https://api.apitube.io/v1/people/1316868",
params={"api_key": "YOUR_API_KEY"},
)
print(resp.json())
const resp = await fetch("https://api.apitube.io/v1/people/1316868?api_key=YOUR_API_KEY");
console.log(await resp.json());
$data = json_decode(file_get_contents("https://api.apitube.io/v1/people/1316868?api_key=YOUR_API_KEY"), 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/people/1316868")
q := u.Query()
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/people/1316868?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/people/1316868
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
{
"id": 1316868,
"name": "Michelle Obama",
"type": "person",
"links": { "self": "...", "articles": "...", "wikipedia": "...", "wikidata": "..." },
"profile": { "title": "attorney at law", "bio_summary": "...", "social_profiles": {} },
"coverage": {
"article_count": 180,
"first_seen": "2017-01-06",
"last_seen": "2026-03-03",
"sentiment": { "positive": 47, "neutral": 95, "negative": 27 },
"momentum": { "last_30_days": 12, "previous_30_days": 8, "change_pct": 50 },
"timeline": [ { "period": "2026-02-01", "count": 13 } ],
"top_sources": [ { "id": 342, "name": "cbc.ca", "domain": "cbc.ca", "count": 9 } ],
"top_topics": [ { "id": "politics", "name": "Politics", "count": 70 } ],
"top_countries": [ { "id": 102, "name": "United States", "code": "us", "count": 55 } ],
"top_languages": [ { "id": 1, "name": "English", "code": "en", "count": 118 } ],
"related_entities": [ { "id": 1316867, "name": "Barack Obama", "count": 348 } ]
},
"recent_articles": [ { "id": 3074512345, "title": "...", "href": "...", "published_at": "...", "body": "...", "entities": [], "categories": [], "sentiment": {} } ]
}Coverage fields
| Field | Description |
|---|---|
article_count | Total articles mentioning this person. |
first_seen / last_seen | Date range of coverage. |
sentiment | Article counts by overall polarity. |
momentum | Mentions in the last 30 days vs. the previous 30 days, with change_pct. |
timeline | Monthly mention counts (chronological, up to 24 months). |
top_sources | Sources covering this person most. |
top_topics | Most associated topics. |
top_countries / top_languages | Geographic and language spread of coverage. |
related_entities | Entities most often mentioned in the same articles as this person. |
recent_articles | Latest articles mentioning this person (same fields as /v1/news/everything). |
Pricing
Each request costs 1 point, charged only when the response contains at least one result. A search returning zero results is free. Requests with no remaining credits return 402.
Errors
A request for a non-existent person returns:
{ "errors": [ { "status": 404, "code": "ER0151", "message": "Person not found." } ] }