API-dokumentaatio
Avoin JSON-rajapinta VRL Tulosarkiston dataan. Ei API-avainta, ei rekisteröitymistä.
Perusosoite (base URL):
https://vrl-results-b3eve6e9c3ftaub8.westeurope-01.azurewebsites.net/api
- Kaikki vastaukset ovat
application/json, UTF-8. - Vain
GET-pyyntöjä, data on julkista ja luku-only. -
CORS on auki (
Access-Control-Allow-Origin: *), joten voit kutsua rajapintaa suoraan selaimenfetch():llä miltä tahansa sivulta. - Data kootaan sivustolta virtuaalihevoset.net ja koskee vain Lyhyt/pitkä arvonta -kilpailuja. Päivittyy kerran vuorokaudessa.
Endpointit
GET /hevonen/{VH-tunnus}
Palauttaa listan kaikista kilpailuista, joissa kyseinen hevonen on ollut
mukana, vanhimmasta uusimpaan. Tyhjä lista [] jos tunnusta ei
löydy.
Esimerkki: /hevonen/VH24-012-0038
[
{
"result_id": "211584",
"competition_date": "30.04.2024",
"division": "Kenttäratsastusjaos (KERJ)",
"organizing_stable": "Bråvalla Stall (BRA1399)",
"invitation_url": "https://kanelipulla.net/bravalla/kisat/kerjcup0424.php",
"class": "CIC3 (avoin vain hevosille, ei suomenhevosille)",
"placement": 46,
"participant_count": 49,
"rider_vrl": "VRL-10735"
}
]
GET /kilpailu/{result_id}
Yhden kilpailun perustiedot ja kaikki tulosrivit. Palauttaa
404 ja {"error": "not_found"} jos id:tä ei ole.
Esimerkki: /kilpailu/252344
{
"competition": {
"result_id": "252344",
"competition_id": "#255001",
"competition_date": "31.08.2026",
"division": "Kenttäratsastusjaos (KERJ)",
"organizing_stable": "Harmony Sporthorses (HARS3691)",
"draw_method": "Lyhyt/pitkä arvonta",
"invitation_url": "https://kwpnyhdistys.altervista.org/cup/elo26.html"
},
"results": [
{
"class": "CIC1 (avoin vain poneille ja hevosille)",
"participant_count": 9,
"placed_count": 3,
"placement": 1,
"rider_vrl": "VRL-10735",
"horse_vh": "VH24-012-0038"
}
]
}
GET /viimeisimmat?raja={n}
Viimeksi tallennetut kilpailut, uusin ensin. Valinnainen
raja (oletus 15).
Esimerkki: /viimeisimmat?raja=10
[
{
"result_id": "252344",
"competition_id": "#255001",
"competition_date": "31.08.2026",
"division": "Kenttäratsastusjaos (KERJ)",
"organizing_stable": "Harmony Sporthorses (HARS3691)",
"draw_method": "Lyhyt/pitkä arvonta",
"invitation_url": "https://kwpnyhdistys.altervista.org/cup/elo26.html"
}
]
Esimerkki: hevosen tulokset omalle sivulle
Alla olevat esimerkit hakevat hevosen kilpailut VH-tunnuksella ja tulostavat
ne taulukkona. Vaihda VH24-012-0038 oman hevosesi tunnukseen.
Vaihtoehto A — HTML + JavaScript (selainpuoli)
Toimii millä tahansa sivulla, myös staattisella. Ei tarvita palvelinta. Liitä tämä kohtaan, jossa haluat taulukon näkyvän:
<div id="vrl-tulokset">Ladataan kilpailutuloksia…</div>
<script>
(function () {
var VH = "VH24-012-0038"; // <-- hevosen VH-tunnus
var API = "https://vrl-results-b3eve6e9c3ftaub8.westeurope-01.azurewebsites.net/api";
var box = document.getElementById("vrl-tulokset");
fetch(API + "/hevonen/" + encodeURIComponent(VH))
.then(function (r) {
if (!r.ok) throw new Error("HTTP " + r.status);
return r.json();
})
.then(function (kisat) {
if (!kisat.length) { box.textContent = "Ei kilpailutuloksia."; return; }
var html = "<table><thead><tr>"
+ "<th>Pvm</th><th>Jaos</th><th>Luokka</th>"
+ "<th>Sij.</th><th>Osall.</th><th>Ratsastaja</th>"
+ "<th>Järjestäjä</th></tr></thead><tbody>";
kisat.forEach(function (k) {
html += "<tr>"
+ "<td>" + esc(k.competition_date) + "</td>"
+ "<td>" + esc(k.division) + "</td>"
+ "<td>" + esc(k.class) + "</td>"
+ "<td>" + k.placement + "</td>"
+ "<td>" + k.participant_count + "</td>"
+ "<td>" + esc(k.rider_vrl) + "</td>"
+ "<td>" + esc(k.organizing_stable) + "</td>"
+ "</tr>";
});
box.innerHTML = html + "</tbody></table>";
})
.catch(function (e) {
box.textContent = "Tulosten haku epäonnistui: " + e.message;
});
// Estää HTML-injektion tallinimissä yms.
function esc(s) {
return String(s == null ? "" : s).replace(/[&<>"]/g, function (c) {
return { "&": "&", "<": "<", ">": ">", '"': """ }[c];
});
}
})();
</script>
Vaihtoehto B — PHP (palvelinpuoli)
Kun sivusi pyörii PHP:llä. Yksinkertaisin tapa, jos palvelimella on
allow_url_fopen päällä (yleensä on):
<?php
$vh = 'VH24-012-0038'; // hevosen VH-tunnus
$api = 'https://vrl-results-b3eve6e9c3ftaub8.westeurope-01.azurewebsites.net/api';
$json = @file_get_contents($api . '/hevonen/' . rawurlencode($vh));
$kisat = $json !== false ? json_decode($json, true) : null;
if (!$kisat) {
echo '<p>Ei kilpailutuloksia.</p>';
return;
}
?>
<table>
<thead>
<tr>
<th>Pvm</th><th>Jaos</th><th>Luokka</th><th>Sij.</th>
<th>Osall.</th><th>Ratsastaja</th><th>Järjestäjä</th>
</tr>
</thead>
<tbody>
<?php foreach ($kisat as $k): ?>
<tr>
<td><?= htmlspecialchars($k['competition_date']) ?></td>
<td><?= htmlspecialchars($k['division']) ?></td>
<td><?= htmlspecialchars($k['class']) ?></td>
<td><?= (int) $k['placement'] ?></td>
<td><?= (int) $k['participant_count'] ?></td>
<td><?= htmlspecialchars($k['rider_vrl']) ?></td>
<td><?= htmlspecialchars($k['organizing_stable']) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
Jos allow_url_fopen on pois päältä, käytä cURL:ia:
<?php
function vrl_hae(string $url): ?array {
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 15,
CURLOPT_USERAGENT => 'oma-talli-sivu/1.0',
]);
$body = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return ($body !== false && $code === 200) ? json_decode($body, true) : null;
}
$api = 'https://vrl-results-b3eve6e9c3ftaub8.westeurope-01.azurewebsites.net/api';
$kisat = vrl_hae($api . '/hevonen/' . rawurlencode('VH24-012-0038'));
<?php
$cache = sys_get_temp_dir() . '/vrl_' . $vh . '.json';
if (!is_file($cache) || time() - filemtime($cache) > 3600) {
$fresh = @file_get_contents($api . '/hevonen/' . rawurlencode($vh));
if ($fresh !== false) {
file_put_contents($cache, $fresh);
}
}
$kisat = json_decode(@file_get_contents($cache) ?: 'null', true);
Linkitä kilpailu takaisin arkistoon
Jokaisella rivillä on result_id. Sillä saat linkin kilpailun
koko tulosnäkymään:
https://vrl-tulosarkisto.pages.dev/?tulos_id=252344
Huomioita
- Ensimmäinen pyyntö hetkeen voi kestää muutaman sekunnin (palvelin herää lepotilasta); sen jälkeen vastaukset ovat alle sekunnin.
- Ei virallista pyyntörajaa, mutta ole kohtuullinen — välimuisti hoitaa 99 % tarpeesta.
- Rajapinta ja data voivat muuttua ilman erillistä ilmoitusta. Kentät lisätään yleensä perään, joten olemassa olevat eivät katoa.