Skip to content

People

The People endpoints provide a searchable directory of known persons — public figures, politicians, executives — enriched with Wikidata metadata, plus a coverage block (how they are covered across the news) and the latest articles mentioning them.

To use the API, you'll require an API key. You can obtain one by signing up on the APITube website.

Added in 1.0.42

Full response field definitions are in API Response Structure. See also the Build a person dossier recipe.

Endpoints

GET /v1/people          # list & search
GET /v1/people/{id}     # single person profile

Authentication via the X-API-Key header or the api_key query parameter.

GET /v1/people

Query Parameters

ParameterTypeRequiredDescription
namestringNoFilter by person name (substring match).
wikidata_idstringNoFilter by Wikidata ID (e.g. Q317521 or 317521).
pageintegerNoPage number (default 1).
per_pageintegerNoResults per page (default 100, max 250).
api_keystringYes*Your API key. Can also be provided via headers.

* Required if not provided in headers

Example

bash
curl "https://api.apitube.io/v1/people?name=Obama&per_page=5&api_key=YOUR_API_KEY"
python
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())
javascript
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());
php
$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);
go
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)
}
java
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());
    }
}
text
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/parameters
json
{
  "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}

Returns a single person, including the full Wikidata-enriched profile, a coverage block, and recent_articles.

Query Parameters

ParameterTypeRequiredDescription
coveragestringNoSet to false to omit the coverage block (faster response).
api_keystringYes*Your API key.

Example

bash
curl "https://api.apitube.io/v1/people/1316868?api_key=YOUR_API_KEY"
python
import requests

resp = requests.get(
    "https://api.apitube.io/v1/people/1316868",
    params={"api_key": "YOUR_API_KEY"},
)
print(resp.json())
javascript
const resp = await fetch("https://api.apitube.io/v1/people/1316868?api_key=YOUR_API_KEY");
console.log(await resp.json());
php
$data = json_decode(file_get_contents("https://api.apitube.io/v1/people/1316868?api_key=YOUR_API_KEY"), true);
print_r($data);
go
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)
}
java
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());
    }
}
text
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/parameters
json
{
  "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": "...", "title": "...", "href": "...", "published_at": "..." } ]
}

Coverage fields

FieldDescription
article_countTotal articles mentioning this person.
first_seen / last_seenDate range of coverage.
sentimentArticle counts by overall polarity.
momentumMentions in the last 30 days vs. the previous 30 days, with change_pct.
timelineMonthly mention counts (chronological, up to 24 months).
top_sourcesSources covering this person most.
top_topicsMost associated topics.
top_countries / top_languagesGeographic and language spread of coverage.
related_entitiesEntities most frequently co-mentioned in the same articles.
recent_articlesLatest articles mentioning this person (same shape 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:

json
{ "errors": [ { "status": 404, "code": "ER0151", "message": "Person not found." } ] }