ProPublica API endpoint
Returns one ProPublica staff/contributor's public profile: name, bio, contact email and social accounts where published, and one page of their recent bylined stories.
/propublica/authorReturns one ProPublica staff/contributor's public "/people/<slug>" profile: name, bio, contact email and social accounts where the profile publishes them, and one page of their recent bylined stories.
Query parameters:
url (required): a canonical https://www.propublica.org/people/<slug> URL.page (optional): 1-based page of recent stories to return; defaults to 1.ProPublica's profile template has no structured job-title field, so there is no job_title in the response -- only free-form bio prose. contact_email and social_links (e.g. x, linkedin, signal) reflect only what the person's own profile publishes and may be empty. Each article's published_at is an ISO-8601 timestamp taken directly from the profile page's own story-card markup.
Example response (truncated):
{"code":200,"data":{"url":"https://www.propublica.org/people/william-turton","name":"William Turton","bio":["William Turton is a reporter at ProPublica covering national security."],"contact_email":"[email protected]","social_links":{"linkedin":"https://www.linkedin.com/in/william-turton","x":"https://x.com/williamturton"},"page":1,"articles":[{"title":"Example investigation","url":"https://www.propublica.org/article/example-investigation","published_at":"2026-09-22T09:00:00Z"}]}}
| Field | Filled in, of 10 checked | Values in the sample |
|---|---|---|
| title | 10 | median 85 characters |
| url | 10 | propublica.org and 1 other host |
| published_at | 10 | 2018-11-05 to 2026-09-23 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| url | string | Yes | Canonical propublica.org/people/<slug> URL | https://www.propublica.org/people/william-turton | |
| page | integer | No | 1 | 1-based page of recent stories to return; defaults to 1 | 1 |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/propublica/author?url=https%3A%2F%2Fwww.propublica.org%2Fpeople%2Fwilliam-turton&page=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"data": {
"url": "https://www.propublica.org/people/william-turton",
"name": "William Turton",
"bio": [
"William Turton is a reporter at ProPublica covering national security."
],
"contact_email": "[email protected]",
"social_links": {
"linkedin": "https://www.linkedin.com/in/william-turton",
"x": "https://x.com/williamturton"
},
"page": 1,
"articles": [
{
"title": "Example investigation",
"url": "https://www.propublica.org/article/example-investigation",
"published_at": "2026-09-22T09:00:00Z"
}
]
}
}Request schema
No body schema
Response schema
#/definitions/publicnews.propublicaAuthorResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| data | propublica.AuthorResponse | No | ||||
| data.articles | array | No | ||||
| data.articles[].published_at | string | No | ||||
| data.articles[].title | string | No | ||||
| data.articles[].url | string | No | ||||
| data.bio | array | No | ||||
| data.contact_email | string | No | ||||
| data.name | string | No | ||||
| data.page | integer | No | ||||
| data.social_links | object | No | ||||
| data.url | string | No |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/propublica/author?url=https%3A%2F%2Fwww.propublica.org%2Fpeople%2Fwilliam-turton&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"