Public data API
One JSON endpoint. The entire CSGeoguesser library.
We expose the full callout dataset at /csgeo/data.json so you can build streamer overlays, study tools, Discord bots, blog embeds, or whatever else without scraping our HTML.
Endpoint
GET https://cs2apps.com/csgeo/data.jsonStatic — built at deploy time. Cache-Control: public, max-age=3600 so you can hammer it without worrying.
Sample response
{
"schemaVersion": 1,
"generatedAt": "2026-05-08T18:00:00.000Z",
"site": "cs2apps.com",
"license": "CC BY 4.0 — please credit cs2apps.com when redistributing.",
"laneLabels": { "long": "Long", "mid": "Mid", "short": "Short / Catwalk", "tunnels": "Tunnels", "a-site": "A site", "b-site": "B site", "t-spawn": "T spawn" },
"difficultyLabels": { "easy": "Easy", "medium": "Medium", "hard": "Hard" },
"maps": [
{ "slug": "dust2", "name": "Dust 2", "spotCount": 18 }
],
"locations": [
{
"id": "dust2-mid-doors-corrugated",
"mapSlug": "dust2",
"callout": "Mid Doors",
"description": "Corrugated lean-to at T-side mid doors entry.",
"x": 0.55,
"y": 0.5,
"lane": "mid",
"difficulty": "medium",
"screenshot": "https://cs2apps.com/screenshots/dust2/image2.jpg",
"permalink": "https://cs2apps.com/csgeo/dust2/spot/dust2-mid-doors-corrugated/"
}
]
}Truncated to one location for clarity. Full payload includes all 18 Dust 2 spots and grows as more maps are seeded.
Example use
// Fetch the full CSGeoguesser dataset
const res = await fetch('https://cs2apps.com/csgeo/data.json');
const data = await res.json();
// Filter to a specific map and difficulty
const easy = data.locations.filter(
(l) => l.mapSlug === 'dust2' && l.difficulty === 'easy'
);
// Render an embed thumbnail strip
easy.forEach((spot) => {
console.log(spot.callout, spot.screenshot, spot.permalink);
});License
CC BY 4.0. Use it commercially, modify it, embed it. We just ask that anything you publish credits cs2apps.com with a backlink. The screenshots themselves are CS2 assets owned by Valve — embedding them via our URLs is fine, but don’t rehost them under your own domain.
Schema notes
- x, y are normalized 0–1 coordinates on the minimap PNG. (0, 0) is top-left, (1, 1) bottom-right. Multiply by your minimap render size to get pixel coords.
- lane is one of:
long, mid, short, tunnels, a-site, b-site, t-spawn, ct-spawn. Optional — older entries may be null. - difficulty:
easy(unique landmarks),medium(recognizable),hard(generic walls/crates). Optional. - schemaVersion follows semver-major. Field additions don’t bump it; field removals or type changes do.
Built something cool?
Drop us a note via About / Contribute and we’ll feature it on the site.