https://api.vatadezahar.com/API3
Documentație Trivia API.
Tot ce ai nevoie pentru a integra întrebări trivia în limba română în jocuri, quiz-uri, aplicații interactive, boți sau proiecte personale.
Documentație
Integrare simplă, întrebări gata de folosit.
Trivia API este un REST API care oferă întrebări în limba română, pregătite pentru aplicații, jocuri, quiz-uri și boți. Fiecare întrebare include variantele disponibile, dificultatea, explicația și indexul răspunsului corect, într-un format JSON ușor de integrat.
X-API-Key: cheia-ta
JSON
Endpointuri
Orice dificultate sau un nivel ales de tine.
Poți cere o întrebare aleatorie din întreaga colecție sau poți limita rezultatul la un nivel de dificultate: Easy, Medium ori Hard. Fiecare request returnează o singură întrebare.
/trivia/random
Returnează o întrebare aleatorie, indiferent de dificultate.
/trivia/random/easy
Returnează o întrebare cu dificultatea Easy.
/trivia/random/medium
Returnează o întrebare cu dificultatea Medium.
/trivia/random/hard
Returnează o întrebare cu dificultatea Hard.
Autentificare
Cheia API se trimite la fiecare request.
Varianta recomandată este header-ul X-API-Key.
Pentru teste rapide, cheia poate fi transmisă și prin query string,
însă această metodă nu este recomandată în producție.
Cheia trimisă prin URL poate ajunge în istoricul browserului, loguri, analytics sau capturi de ecran. Pentru aplicații publice, păstrează cheia pe server și apelează Trivia API prin propriul backend.
const response = await fetch(
'https://api.vatadezahar.com/API3/trivia/random',
{
headers: {
'X-API-Key': 'cheia-ta-api',
'Accept': 'application/json'
}
}
);
const data = await response.json();
if (!data.ok) {
console.error(data.error.code, data.error.message);
return;
}
console.log(data.data.question);
$ch = curl_init(
'https://api.vatadezahar.com/API3/trivia/random'
);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'X-API-Key: cheia-ta-api',
'Accept: application/json'
],
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($response, true);
if (!is_array($data) || empty($data['ok'])) {
echo $data['error']['message'] ?? 'Request nereușit.';
exit;
}
print_r($data['data']['question']);
curl \
-H "X-API-Key: cheia-ta-api" \
-H "Accept: application/json" \
https://api.vatadezahar.com/API3/trivia/random
https://api.vatadezahar.com/API3/trivia/random?key=cheia-ta-api
Structura răspunsului
Fiecare request întoarce un JSON organizat.
Răspunsul păstrează aceeași structură în toate endpointurile Trivia.
Informația principală se află în data.question.
Indică dacă requestul a fost procesat cu succes.
Include timestamp-ul, metoda HTTP și endpointul apelat.
Conține întrebarea, dificultatea, variantele de răspuns, explicația și indexul răspunsului corect.
{
"ok": true,
"api": "API3",
"version": "1.0 (vatadezahar.com)",
"meta": {
"timestamp": "2026-07-09T12:15:21+03:00",
"method": "GET",
"endpoint": "/trivia/random"
},
"data": {
"question": {
"id": 157,
"text": "Care țară subțire ca brici reprezintă mai mult de jumătate din coasta de vest a Americii de Sud?",
"explanation": "Țara sud-americană Chile este una dintre cele mai lungi țări din lume.",
"difficulty": "Easy",
"answers": [
"Brazilia",
"Chile",
"Columbia",
"Argentina"
],
"correct_index": 1
}
}
}
Structura întrebării
Tot ce ai nevoie se află în data.question.
Obiectul întrebării include textul afișat utilizatorului, variantele disponibile, dificultatea, explicația răspunsului corect și indexul folosit pentru validare.
Identificatorul unic al întrebării. Poate fi folosit pentru statistici, favorite, progres, leaderboard-uri sau pentru a evita procesarea aceleiași întrebări de mai multe ori în aplicația ta.
Textul întrebării care trebuie afișat utilizatorului.
Nivelul de dificultate al întrebării:
Easy, Medium sau Hard.
Lista variantelor de răspuns. Ordinea trebuie păstrată dacă folosești
direct valoarea din correct_index.
Indexul răspunsului corect din lista answers.
Indexarea începe de la 0, nu de la 1.
Explicația răspunsului corect. Este utilă după o alegere greșită, după expirarea timpului sau într-o zonă educativă a aplicației.
correct_index
Indexul începe de la 0. O valoare
correct_index: 1 indică al doilea element din lista
answers.
{
"id": 157,
"text": "Care țară subțire ca brici reprezintă mai mult de jumătate din coasta de vest a Americii de Sud?",
"explanation": "Țara sud-americană Chile este una dintre cele mai lungi țări din lume.",
"difficulty": "Easy",
"answers": [
"Brazilia",
"Chile",
"Columbia",
"Argentina"
],
"correct_index": 1
}
const question = data.data.question;
const correctAnswer =
question.answers[question.correct_index];
console.log(question.text);
console.log(question.answers);
console.log(correctAnswer);
// correct_index este 1
// question.answers[1] este "Chile"
$question = $data['data']['question'];
$correctIndex = $question['correct_index'];
$correctAnswer = $question['answers'][$correctIndex];
echo $question['text'] . PHP_EOL;
print_r($question['answers']);
echo 'Răspuns corect: ' . $correctAnswer . PHP_EOL;
// correct_index este 1
// answers[1] este "Chile"
Exemple de integrare
O integrare completă în doar câteva linii de cod.
Indiferent dacă folosești JavaScript, PHP sau Node.js, integrarea
urmează aceeași structură: trimiți cheia API, verifici răspunsul
și citești obiectul data.question.
const response = await fetch(
'https://api.vatadezahar.com/API3/trivia/random',
{
headers: {
'X-API-Key': 'cheia-ta-api',
'Accept': 'application/json'
}
}
);
const data = await response.json();
if (!data.ok) {
console.error(
data.error.code,
data.error.message
);
return;
}
const question = data.data.question;
console.log('Întrebare:', question.text);
console.log('Răspunsuri:', question.answers);
const correctAnswer =
question.answers[question.correct_index];
console.log('Răspuns corect:', correctAnswer);
$ch = curl_init(
'https://api.vatadezahar.com/API3/trivia/random'
);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'X-API-Key: cheia-ta-api',
'Accept: application/json'
]
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($response, true);
if (!is_array($data) || empty($data['ok'])) {
echo $data['error']['message']
?? 'Request nereușit.';
exit;
}
$question = $data['data']['question'];
echo 'Întrebare: '
. $question['text']
. PHP_EOL;
echo 'Răspunsuri:'
. PHP_EOL;
foreach ($question['answers'] as $index => $answer) {
echo $index
. ': '
. $answer
. PHP_EOL;
}
$correctAnswer =
$question['answers'][$question['correct_index']];
echo 'Răspuns corect: '
. $correctAnswer
. PHP_EOL;
const response = await fetch(
'https://api.vatadezahar.com/API3/trivia/random/hard',
{
headers: {
'X-API-Key': 'cheia-ta-api',
'Accept': 'application/json'
}
}
);
const data = await response.json();
if (!data.ok) {
console.error(
data.error.code,
data.error.message
);
process.exit(1);
}
const question = data.data.question;
console.log(question.text);
question.answers.forEach((answer, index) => {
console.log(`${index}: ${answer}`);
});
console.log(
'Răspuns corect:',
question.answers[question.correct_index]
);
Cache inteligent
Fiecare cheie API are propriul istoric de întrebări.
Trivia API încearcă automat să evite repetarea întrebărilor pentru aceeași cheie API. Nu este nevoie să implementezi propriul sistem de cache doar pentru a evita duplicatele.
Fiecare API key are propriul istoric. Întrebările primite de un proiect nu influențează întrebările primite de alt proiect.
API-ul încearcă să parcurgă întreaga colecție înainte ca întrebările să înceapă să se repete.
Endpointurile Easy, Medium și Hard folosesc istorice independente, astfel încât fiecare categorie își parcurge propria colecție.
/trivia/random folosește propriul istoric.
/trivia/random/easy are un istoric separat.
/trivia/random/medium are un istoric separat.
/trivia/random/hard are un istoric separat.
Rate limit
Limitele sunt vizibile în fiecare răspuns.
Fiecare cheie API are limite proprii pe minut și pe zi. API-ul trimite headere care arată limita curentă, numărul de requesturi rămase și timpul până la resetare.
Numărul maxim de requesturi permise într-un interval de un minut.
X-RateLimit-Limit-Minute
Numărul de requesturi care mai pot fi trimise în intervalul curent.
X-RateLimit-Remaining-Minute
Numărul de secunde rămase până la resetarea limitei pe minut.
X-RateLimit-Reset-Minute
X-RateLimit-Limit-Minute: 60
X-RateLimit-Remaining-Minute: 42
X-RateLimit-Reset-Minute: 18
X-RateLimit-Limit-Day: 10000
X-RateLimit-Remaining-Day: 9842
X-RateLimit-Reset-Day: 28740
const response = await fetch(
'https://api.vatadezahar.com/API3/trivia/random',
{
headers: {
'X-API-Key': 'cheia-ta-api',
'Accept': 'application/json'
}
}
);
const minuteLimit = response.headers.get(
'X-RateLimit-Limit-Minute'
);
const minuteRemaining = response.headers.get(
'X-RateLimit-Remaining-Minute'
);
const minuteReset = response.headers.get(
'X-RateLimit-Reset-Minute'
);
console.log({
minuteLimit,
minuteRemaining,
minuteReset
});
$ch = curl_init(
'https://api.vatadezahar.com/API3/trivia/random'
);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => true,
CURLOPT_HTTPHEADER => [
'X-API-Key: cheia-ta-api',
'Accept: application/json'
]
]);
$response = curl_exec($ch);
$headerSize = curl_getinfo(
$ch,
CURLINFO_HEADER_SIZE
);
$headers = substr(
$response,
0,
$headerSize
);
$body = substr(
$response,
$headerSize
);
curl_close($ch);
echo $headers;
echo $body;
X-RateLimit-Limit-Minute este 60,
X-RateLimit-Remaining-Minute este 42 și
X-RateLimit-Reset-Minute este 18, înseamnă
că mai poți trimite 42 de requesturi, iar intervalul curent se resetează
în 18 secunde.
Erori
Toate erorile folosesc aceeași structură JSON.
Dacă requestul nu poate fi procesat, câmpul ok va fi
false, iar informațiile despre problemă se vor afla în
obiectul error.
missing_api_key
Cheia API lipsește din request.
invalid_api_key
Cheia API trimisă nu este validă.
api_key_disabled
Cheia API există, dar a fost dezactivată.
ip_not_allowed
IP-ul curent nu este permis pentru cheia API folosită.
rate_limit_exceeded
Limita de requesturi a fost depășită.
endpoint_not_found
Endpointul cerut nu există.
method_not_allowed
Metoda HTTP folosită nu este permisă pentru endpoint.
internal_server_error
A apărut o eroare internă. Stack trace-ul nu este expus în producție.
error.code în codul aplicației, nu message.
Mesajele pot fi îmbunătățite în timp, dar codurile de eroare rămân stabile.
{
"ok": false,
"error": {
"code": "missing_api_key",
"message": "API key is required."
}
}
{
"ok": false,
"error": {
"code": "invalid_api_key",
"message": "Invalid API key."
}
}
{
"ok": false,
"error": {
"code": "permission_denied",
"message": "This API key does not have permission to access this endpoint."
}
}
{
"ok": false,
"error": {
"code": "ip_not_allowed",
"message": "This API key is not allowed from this IP address."
}
}
{
"ok": false,
"error": {
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded for minute.",
"details": {
"type": "minute",
"limit": 60,
"current": 60,
"remaining": 0,
"reset_in": 22
}
}
}
FAQ
Întrebări frecvente.
Câteva clarificări despre dificultăți, repetarea întrebărilor, validarea răspunsurilor și modul în care evoluează Trivia API.
Trivia API încearcă să evite repetarea întrebărilor pentru aceeași cheie API. Fiecare cheie are propriul istoric, iar întrebările încep să se repete doar după ce colecția disponibilă a fost parcursă.
Da. Pe lângă endpointul general /trivia/random,
există endpointuri dedicate pentru Easy,
Medium și Hard.
Fiecare dificultate are propriul istoric, separat de endpointul general și de celelalte niveluri.
Nu este necesar dacă scopul este doar evitarea întrebărilor duplicate. API-ul gestionează automat istoricul pentru fiecare cheie API și pentru fiecare dificultate.
Poți implementa propriul cache dacă aplicația ta are cerințe suplimentare, de exemplu sesiuni salvate, progres local sau funcționare temporară offline.
Da. Câmpul correct_index indică poziția răspunsului
corect în lista answers.
Este recomandat să validezi răspunsul folosind indexul, nu textul, pentru a evita probleme provocate de formatare sau comparații de șiruri.
Nu. Trivia API poate fi folosit și în proiecte educaționale, dar este gândit în primul rând pentru experiențe interactive și distractive: jocuri, boți, aplicații mobile, stream-uri sau quiz-uri online.
Colecția include atât întrebări de cultură generală, cât și curiozități sau întrebări mai neobișnuite, pentru ca rundele să nu devină repetitive ori prea previzibile.
Da. Colecția poate fi extinsă în timp, iar întrebările existente pot fi corectate sau îmbunătățite atunci când este nevoie.
Pe viitor poate exista și un sistem prin care comunitatea să propună întrebări noi. Acestea ar urma să fie verificate înainte să devină disponibile în API.
Trivia API este un proiect personal întreținut și îmbunătățit în timp. Întrebările noi, corecturile și modificările de structură devin disponibile automat prin aceleași endpointuri.
Pentru schimbările care ar putea afecta integrarea, documentația va fi actualizată astfel încât comportamentul API-ului să rămână clar.