Real or fake village
Romania's real village names are stranger than anything we could make up. Almost. Every place in the national register, a name machine trained on all of them, and a quiz: one name is real, one we made up. You pick.
Which one is a real place?
How the fakes are made
A character chain (an order-3 Markov chain, if you like the words) read all 10,236 distinct real names one letter at a time and learned which letter tends to follow every three. To make a name it starts from nothing and keeps picking the next letter the way real names would. Spaces count as letters, which is how it learns "de Sus", "Valea ..." and "... Mare" without being told.
Then the rules. Any name that already exists in the register (a village, a commune, a town or a county, diacritics ignored) is thrown away, and so are clumsy shapes and anything rude. Whatever is left is new, and the API always marks it "exists": false. The same seed gives the same name, so a name or a quiz can be shared as a link.
Endpoints
| Method | Path | What you get |
|---|---|---|
| GET | /v1/sate/quiz | One real name and one made up, as a and b in random order, a signed token and the two answer links. Takes seed and format=text. |
| GET | /v1/sate/quiz/{token} | Your guess checked: right or wrong, a quip, the real place in full and the fake's name. Takes format=text. |
| GET | /v1/sate/fake | A made-up name that is nowhere in the register, with seed, permalink and "exists": false. Takes format=text. |
| GET | /v1/sate/random | A real place: type, commune, county, SIRUTA code, coordinates. Takes judet and format=text. |
| GET | /v1/sate/search | Real places whose name contains q, best matches first. Case and diacritics do not matter. Takes judet, page, per_page. |
| GET | /v1/sate/counties | The 41 counties and București, with the codes judet takes and how many places each has. |
| GET | /v1/sate/sign | A village entry sign with any name, as SVG or PNG. exit=1 crosses it out, like the one on the way out. |
| GET | /v1/sate | Counts, the source and a link to every endpoint. |
Parameters
| Name | Example | Does |
|---|---|---|
seed | mamaliga | quiz and fake: the same seed gives the same result, forever. 1 to 64 letters, digits, - or _. Leave it out for a fresh one. |
guess | a | quiz/{token}: a or b. |
judet | CJ | random and search: one county, by code (CJ, B) or by name, diacritics optional (cluj, bistrita-nasaud). |
q | fundu | search: 2 to 40 characters. fundu finds Fundu Moldovei, gara finds Lehliu-Gară. |
page, per_page | 2, 10 | search: per_page is 1 to 50, default 20. |
name | Covrigi | sign: 1 to 40 letters, digits, spaces, dots or hyphens. Long names go on two lines, like on the road. |
exit | 1 | sign: the sign on the way out, name crossed by a diagonal bar. |
format | text | One plain line instead of JSON on quiz, quiz/{token}, fake and random. On sign: svg (default) or png. |
Calls
$ curl https://api.tasta.space/v1/sate/quiz
$ curl "https://api.tasta.space/v1/sate/fake?seed=mamaliga&format=text"
$ curl "https://api.tasta.space/v1/sate/random?judet=MM"
$ curl "https://api.tasta.space/v1/sate/search?q=fundu&per_page=5"
A real place looks like this
{
"data": {
"name": "Covrigi",
"type": "sat",
"is_seat": false,
"commune": {
"name": "Văgiulești",
"type": "comună",
"siruta": 82779
},
"county": {
"name": "Gorj",
"code": "GJ"
},
"siruta": 82804,
"coordinates": {
"lat": 44.7382,
"lon": 23.1492
},
"map": "https://www.openstreetmap.org/?mlat=44.7382&mlon=23.1492#map=14/44.7382/23.1492",
"sign": "https://api.tasta.space/v1/sate/sign?name=Covrigi",
"exists": true
}
}
| Field | Means |
|---|---|
type | sat (a village), oraș (a town), municipiu (a city) or localitate componentă, a part of a town or city the register lists as a place of its own. |
is_seat | True for the village that is the seat of its commune, and for the main place of a town or city. |
commune | The administrative unit it belongs to: a comună, an oraș or a municipiu, with its own SIRUTA code. |
siruta | The place's code in SIRUTA, the national register, and the way to tell apart the many places that share a name. |
coordinates, map | Where it is, from Wikidata, and a link to it on OpenStreetMap. null for the few places Wikidata has no point for. |
sign | Its entry sign, from /v1/sate/sign. |
The quiz, without a session
A quiz is two names and a token. The token is the quiz itself (the real place's SIRUTA code, the made-up name and which slot is real) in base64url, plus an HMAC signature. Nothing is stored anywhere: /v1/sate/quiz/{token}?guess=b checks the signature and answers. A token we did not sign, or one that was edited, gets invalid_token.
It is signed, not encrypted. Decode it and you will know the answer. We trust you.
Errors of its own
On top of the hub's errors.
| Status | Code | When |
|---|---|---|
| 422 | invalid_parameter | A county that does not exist, a search shorter than 2 letters, a guess that is not a or b, a sign name too long, and so on |
| 422 | invalid_token | A quiz token that was not signed here, or was edited |
| 410 | quiz_expired | A real token whose village has since left the register |
Every village gets a sign
Real ones, made-up ones, your own: any name up to 40 characters, set like the Romanian entry sign (white, a black border, the name in black). Add exit=1 for the sign on the way out, with the diagonal bar that is red on the road and orange here.
This one is Covrigi, in Gorj. It is real. The images are cached for a day.
$ curl -o sign.png "https://api.tasta.space/v1/sate/sign?name=Covrigi&exit=1&format=png"
Try it
Sources and licences
The real places are SIRUTA, the register of Romania's administrative units and localities kept by the Institutul Național de Statistică, in its SIRUTA S1 2026 edition from data.gov.ro, published under CC BY 4.0. That is 13,750 places in 3,181 communes, towns and cities. The register writes names in capitals, mostly with cedillas; here they are in proper case with comma-below ș and ț. Where the register drops a diacritic (Rosiori de Vede for Roșiori de Vede), the Romanian label on Wikidata fills it in, but only when the two differ by nothing else.
Coordinates come from Wikidata, matched on the SIRUTA code, and are CC0. The map links open OpenStreetMap.
The made-up names are made up, by us, from the real ones. None of them is in the register: we check every one before it is served. Spotted a wrong name or a missing diacritic? Write to hello@tasta.space.