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.

REST API JSON HTTPS Trivia Quiz

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.

Base URL https://api.vatadezahar.com/API3
Autentificare X-API-Key: cheia-ta
Format răspuns 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.

GET /trivia/random

Returnează o întrebare aleatorie, indiferent de dificultate.

GET /trivia/random/easy

Returnează o întrebare cu dificultatea Easy.

GET /trivia/random/medium

Returnează o întrebare cu dificultatea Medium.

GET /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.

Nu expune cheia API în frontend

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.

ok

Indică dacă requestul a fost procesat cu succes.

meta

Include timestamp-ul, metoda HTTP și endpointul apelat.

data.question

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.

id

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.

text

Textul întrebării care trebuie afișat utilizatorului.

difficulty

Nivelul de dificultate al întrebării: Easy, Medium sau Hard.

answers

Lista variantelor de răspuns. Ordinea trebuie păstrată dacă folosești direct valoarea din correct_index.

correct_index

Indexul răspunsului corect din lista answers. Indexarea începe de la 0, nu de la 1.

explanation

Explicația răspunsului corect. Este utilă după o alegere greșită, după expirarea timpului sau într-o zonă educativă a aplicației.

Important despre 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.

Istoric separat

Fiecare API key are propriul istoric. Întrebările primite de un proiect nu influențează întrebările primite de alt proiect.

Fără duplicate inutile

API-ul încearcă să parcurgă întreaga colecție înainte ca întrebările să înceapă să se repete.

Cache separat pe dificultate

Endpointurile Easy, Medium și Hard folosesc istorice independente, astfel încât fiecare categorie își parcurge propria colecție.

Comportamentul API-ului
/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.
Întrebările încep să se repete doar după ce colecția disponibilă a fost parcursă.

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.

Limită pe minut

Numărul maxim de requesturi permise într-un interval de un minut.

X-RateLimit-Limit-Minute
Requesturi rămase

Numărul de requesturi care mai pot fi trimise în intervalul curent.

X-RateLimit-Remaining-Minute
Resetare

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;
Exemplu: dacă 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.

401 missing_api_key

Cheia API lipsește din request.

401 invalid_api_key

Cheia API trimisă nu este validă.

403 api_key_disabled

Cheia API există, dar a fost dezactivată.

403 ip_not_allowed

IP-ul curent nu este permis pentru cheia API folosită.

429 rate_limit_exceeded

Limita de requesturi a fost depășită.

404 endpoint_not_found

Endpointul cerut nu există.

405 method_not_allowed

Metoda HTTP folosită nu este permisă pentru endpoint.

500 internal_server_error

A apărut o eroare internă. Stack trace-ul nu este expus în producție.

Recomandare: folosește 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.