Base URL: http://localhost:8000/api/
The Veracity API provides access to journalist claims, scores, and leaderboards. All endpoints return JSON responses and support pagination where applicable.
Currently, the API is read-only and does not require authentication. All endpoints are publicly accessible.
GET /api/
Returns a list of all available endpoints.
Response:
{
"journalists": "http://localhost:8000/api/journalists/",
"claims": "http://localhost:8000/api/claims/",
"score-history": "http://localhost:8000/api/score-history/",
"transfers": "http://localhost:8000/api/transfers/"
}GET /api/journalists/
Get a list of all journalists with their scores.
Query Parameters:
search- Search by name, publications, or Twitter handleordering- Sort by field (prefix with-for descending)truthfulness_score(default:-truthfulness_score)speed_scorenamecreated_at
page- Page number (default: 1)page_size- Results per page (default: 20)
Example:
GET /api/journalists/?ordering=-speed_score&page_size=10Response:
{
"count": 3,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"name": "Fabrizio Romano",
"slug": "fabrizio-romano",
"truthfulness_score": "100.00",
"speed_score": "100.00",
"publications": ["The Guardian", "Sky Sports"],
"twitter_handle": "@FabrizioRomano",
"profile_image_url": null,
"total_claims": 2
}
]
}GET /api/journalists/{slug}/
Get detailed information about a specific journalist.
Example:
GET /api/journalists/fabrizio-romano/Response:
{
"id": 1,
"name": "Fabrizio Romano",
"slug": "fabrizio-romano",
"bio": "Italian football journalist...",
"publications": ["The Guardian", "Sky Sports"],
"twitter_handle": "@FabrizioRomano",
"profile_image_url": null,
"truthfulness_score": "100.00",
"speed_score": "100.00",
"accuracy_rate": "100.00",
"total_claims": 2,
"validated_claims": 1,
"pending_claims": 1,
"true_claims": 1,
"false_claims": 0,
"partially_true_claims": 0,
"original_scoops": 2,
"first_to_report_count": 2,
"created_at": "2026-02-08T00:13:17.600945Z",
"updated_at": "2026-02-08T00:13:17.622116Z"
}GET /api/journalists/{slug}/score_history/
Get historical score data for charts (last 30 records).
Example:
GET /api/journalists/fabrizio-romano/score_history/Response:
[
{
"id": 1,
"journalist": 1,
"journalist_name": "Fabrizio Romano",
"truthfulness_score": "100.00",
"speed_score": "100.00",
"total_claims": 2,
"validated_claims": 1,
"true_claims": 1,
"false_claims": 0,
"original_scoops": 2,
"recorded_at": "2026-02-08T00:13:17.622116Z"
}
]GET /api/journalists/{slug}/claims/
Get all claims made by a specific journalist.
Query Parameters:
status- Filter by validation status:pending,confirmed_true,proven_false,partially_true
Example:
GET /api/journalists/fabrizio-romano/claims/?status=confirmed_trueGET /api/journalists/leaderboard/
Get ranked journalists for leaderboards.
Query Parameters:
score_type- Type of score:truthfulness(default) orspeedlimit- Number of results (default: 20)
Example:
GET /api/journalists/leaderboard/?score_type=speed&limit=10Response:
[
{
"rank": 1,
"journalist": {
"id": 1,
"name": "Fabrizio Romano",
"slug": "fabrizio-romano",
"truthfulness_score": "100.00",
"speed_score": "100.00",
"publications": ["The Guardian", "Sky Sports"],
"twitter_handle": "@FabrizioRomano",
"profile_image_url": null,
"total_claims": 2
},
"score": 100.0,
"score_type": "speed"
}
]GET /api/claims/
Get a list of all claims.
Query Parameters:
validation_status- Filter by status:pending,confirmed_true,proven_false,partially_truecertainty_level- Filter by certainty:confirmed,sources_say,rumoured,speculationsource_type- Filter by source:original,citingjournalist- Filter by journalist IDis_first_claim- Filter by first claim:trueorfalseclaim_date__gte- Filter claims after date (ISO format)claim_date__lte- Filter claims before date (ISO format)search- Search in claim text, player name, clubsordering- Sort by field:claim_date(default:-claim_date),validation_date,created_at
Example:
GET /api/claims/?validation_status=confirmed_true&ordering=-claim_dateResponse:
{
"count": 5,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"journalist": 1,
"journalist_name": "Fabrizio Romano",
"journalist_slug": "fabrizio-romano",
"cited_journalist": null,
"cited_journalist_name": null,
"cited_journalist_slug": null,
"claim_text": "Jude Bellingham to Real Madrid...",
"publication": "The Guardian",
"article_url": "https://example.com/...",
"claim_date": "2025-11-10T00:13:17.608226Z",
"player_name": "Jude Bellingham",
"from_club": "Borussia Dortmund",
"to_club": "Real Madrid",
"transfer_fee": "£88.5m",
"certainty_level": "confirmed",
"certainty_level_display": "Confirmed",
"source_type": "original",
"source_type_display": "Original Scoop",
"validation_status": "confirmed_true",
"validation_status_display": "Confirmed True",
"validation_date": "2025-12-10T00:13:17.608234Z",
"validation_notes": "Transfer confirmed...",
"validation_source_url": "",
"is_first_claim": true,
"created_at": "2026-02-08T00:13:17.608383Z",
"updated_at": "2026-02-08T00:13:17.608387Z"
}
]
}GET /api/claims/{id}/
Get detailed information about a specific claim.
Example:
GET /api/claims/1/GET /api/claims/latest/
Get the 20 most recent claims (for homepage feed).
Example:
GET /api/claims/latest/GET /api/claims/pending/
Get all claims awaiting validation.
Example:
GET /api/claims/pending/GET /api/claims/validated/
Get all validated claims (true or false).
Example:
GET /api/claims/validated/GET /api/claims/stats/
Get aggregate statistics across all claims.
Example:
GET /api/claims/stats/Response:
{
"total_claims": 5,
"pending_claims": 2,
"validated_claims": 3,
"true_claims": 2,
"false_claims": 1,
"accuracy_rate": 66.67,
"total_journalists": 3
}GET /api/score-history/
Get historical score records (for analytics).
Query Parameters:
journalist- Filter by journalist IDordering- Sort by field (default:-recorded_at)
Example:
GET /api/score-history/?journalist=1GET /api/transfers/
Get grouped transfers (future feature).
Query Parameters:
completed- Filter by completion:trueorfalsetransfer_window- Filter by transfer windowsearch- Search player name, clubs
Example:
GET /api/transfers/?completed=trueAll list endpoints support pagination with the following response format:
{
"count": 100,
"next": "http://localhost:8000/api/claims/?page=2",
"previous": null,
"results": [...]
}Query Parameters:
page- Page numberpage_size- Results per page (max: 100)
{
"detail": "Not found."
}{
"field_name": [
"Error message"
]
}Currently, there is no rate limiting. This may be added in production.
The API supports CORS for the following origins:
http://localhost:5173(Vite dev server)http://127.0.0.1:5173
You can explore the API interactively in your browser:
- Visit
http://localhost:8000/api/in your browser - Click through the endpoints to see responses
- Django REST Framework provides a user-friendly interface
// Fetch leaderboard
const response = await fetch('http://localhost:8000/api/journalists/leaderboard/?score_type=truthfulness');
const leaderboard = await response.json();
// Fetch journalist details
const journalist = await fetch('http://localhost:8000/api/journalists/fabrizio-romano/');
const data = await journalist.json();
// Fetch latest claims
const claims = await fetch('http://localhost:8000/api/claims/latest/');
const latestClaims = await claims.json();
// Filter claims
const trueClaims = await fetch('http://localhost:8000/api/claims/?validation_status=confirmed_true');
const results = await trueClaims.json();Ready for Phase 3: Frontend development with React!