Every night, Fourmizzz publishes two JSON files for each server: the list of players and the list of alliances. They only contain data that is already public in the game (rankings, alliance page, visible diplomacy) and are intended for players and community tools: maps, progress tracking, alliance tools.
The API is read-only, free and requires no authentication.
The complete contract in OpenAPI 3 format, which can be imported into Swagger Editor, Postman or a client generator, is available here: api-exports.en.openapi.yaml.
The API is served on the address of the server whose data you want:
| Server | Base address |
|---|---|
| English server | http://s1.antzzz.org |
| French S1 | http://s1.fourmizzz.fr |
| French S2 | http://s2.fourmizzz.fr |
| French S3 | http://s3.fourmizzz.fr |
| French S4 | http://s4.fourmizzz.fr |
| French S5 | https://s5.fourmizzz.fr |
| French test server | https://test.fourmizzz.fr |
Use the protocol shown: the English server and French S1 to S4 are only served over HTTP, not HTTPS.
Each server has its own exports. The home domain (www.antzzz.org, www.fourmizzz.fr) and any host that is not an open server answer 404.
| Request | Response |
|---|---|
GET /api/exports/ |
List of available versions, per export type |
GET /api/exports/players/ |
Latest version of the players file |
GET /api/exports/players/?version=YYYYMMDDHHmm |
Players file of this version |
GET /api/exports/alliances/ |
Latest version of the alliances file |
GET /api/exports/alliances/?version=YYYYMMDDHHmm |
Alliances file of this version |
The trailing / is part of the address: without it, the server first answers a 301 redirection to the address with a slash. Better write it directly and save a round trip.
A version is the UTC date and time of the export job run, formatted YYYYMMDDHHmm (year, month, day, hour, minutes), for example 202609292200.
…2200 in summer time (e.g. 202609292200 for the night of September 29 to 30), …2300 in winter time. UTC avoids duplicated or missing hours when the clocks change.Last-Modified header); if it is rerun later, it creates a new version.GET /api/exports/ returns, for each export type, the available versions from newest to oldest:
{
"players": ["202609292200", "202609282200"],
"alliances": ["202609292200", "202609282200"]
}
Both types are generated by the same job run and should therefore have the same versions. They are listed separately because a run can fail on a single type. The arrays are empty ([]) if no export exists yet.
version parameterversion=latest: the most recent version of this type, served directly, without redirection.version=YYYYMMDDHHmm: the file of this version, as uploaded by the job.The date, hour and minutes must exist: 202602300000 (February 30), 202609292400 or 202609292260 answer 400, as does a different format (2026-09-29, 2026092922) or an array (version[]=…).
Content-Type: application/json; charset=utf-8 on every response, errors included. Non-ASCII characters are escaped as JSON \uXXXX sequences, which any JSON parser decodes.Last-Modified:
Errors are always a JSON object {"error": "<message>"}, never an HTML page. The message is in French and is never translated: a tool should rely on the HTTP status code, not on the text.
| Code | Case |
|---|---|
200 |
File or list of versions |
301 |
Address without a trailing /: redirection to the address with a slash |
400 |
Malformed version parameter or impossible date/time |
404 |
No export for this version (or no export of this type with latest); host that is not an open server |
502 |
Exports storage unreachable (server-side incident, already reported to the team) |
503 |
Exports not configured on this hosting |
An array of objects, one per player, sorted by id:
[
{
"id": 123,
"pseudo": "Fourmi",
"alliance": "TAG",
"masterPlayerId": 456,
"x": 10,
"y": -4,
"field": 98765,
"grade": "Chef",
"buildingScore": 1500,
"technologyScore": 700,
"trophyScore": 1234,
"onHoliday": false,
"isBanned": false
}
]
| Field | Type | Meaning |
|---|---|---|
id |
integer | Player identifier. Unique within the server only: two servers each have their own player 123 |
pseudo |
string | Nickname displayed in the game |
alliance |
string or null |
Alliance tag, null if the player has none |
masterPlayerId |
integer or null |
id of the player who colonizes this player, null if not colonized |
x, y |
integers | Coordinates on the map |
field |
integer | Hunting field (cm²) |
grade |
string or null |
Name of the player's rank in their alliance, null without an alliance or without a rank |
buildingScore |
integer | Anthill score (buildings) |
technologyScore |
integer | Technology score |
trophyScore |
integer | Trophy score (Elo ranking), 0 if the player is not ranked |
onHoliday |
boolean | Holiday mode active at export time |
isBanned |
boolean | Player banned at export time |
An array of objects, one per alliance, sorted by tag:
[
{
"tag": "TAG",
"name": "Les Fourmis",
"playersCount": 12,
"totalField": 5000000,
"totalBuildingScore": 300,
"totalTechnologyScore": 200,
"totalTrophyScore": 9000,
"diplomacy": {
"pacts": [{ "tag": "AMI", "name": "Pacte de non-agression", "description": "…" }],
"wars": ["ENN"]
}
}
]
| Field | Type | Meaning |
|---|---|---|
tag |
string | Alliance tag |
name |
string | Alliance name |
playersCount |
integer | Number of members |
totalField |
integer | Combined hunting field of the members |
totalBuildingScore |
integer | Combined anthill score |
totalTechnologyScore |
integer | Combined technology score |
totalTrophyScore |
integer | Sum (not the average) of the members' trophy scores, 0 if the alliance is not ranked |
diplomacy.pacts |
array | Ongoing pacts (see below). A pact appears in both alliances involved. Order: the one each alliance set for its pacts, as on its page |
diplomacy.wars |
array of tags | Alliances this alliance declared war on (direction shown on its public page); vanished alliances are left out. Alphabetical order, case-insensitive |
Each pact is an object:
| Field | Type | Meaning |
|---|---|---|
tag |
string | Partner alliance tag |
name |
string | Name of the pact (not the partner alliance's name) |
description |
string | Pact description |
No private data is exported: no email, no IP address, no resources, no army, no last login date, no alliance description or rules.
List the versions of the English server, headers included:
curl -i http://s1.antzzz.org/api/exports/
Download the alliances file of a specific version:
curl -o alliances.json "http://s1.antzzz.org/api/exports/alliances/?version=202609292200"
Load the latest version of the players in Python, standard library only:
import json
import urllib.request
with urllib.request.urlopen("http://s1.antzzz.org/api/exports/players/") as response:
players = json.load(response)
without_alliance = [p["pseudo"] for p in players if p["alliance"] is None]
print(len(players), "players, including", len(without_alliance), "without an alliance")
GET /api/exports/ and compare the first version with the last one already downloaded.Last-Modified header.id, never by the id alone, and the nickname can change.