Authentication
/authUser registration, login, and session management
Register a new account (player or admin, depending on the code)
Request Body
username: string (required, min 3 chars) password: string (required, min 6 chars) name: string (required) registration_code: string (required) - a team code registers a player on that team; the admin REGISTRATION code (separate from the admin API token) registers an administrator account. Team codes are single-use: one account per code (teammates share that account). Deleting the account frees its code; the admin registration code is not single-use.
Response
user_id: string team: integer message: string
Example
{
"name": "Commander Alpha",
"password": "secretpass123",
"registration_code": "your-team-secret-code",
"username": "player1"
}
Notes
Creates a new user with a command center, starter buildings, and 2 starter drones with mining equipment. Each registration_code is tied to a specific team.
Login and get access token
Request Body
username: string (required) password: string (required)
Response
token: string
user_id: string
registration_codes: object (admin users only) - {admin_token, admin_registration_code, teams: {code: team_number}} so admins can hand out codes straight from login
Example
{
"password": "secretpass123",
"username": "player1"
}
Notes
If MFA is enabled the response is {mfa_required: true, mfa_token} instead; complete with POST /auth/login/mfa, whose response has the same shape as a normal login.
Logout and invalidate token
Response
message: string
Get current user info
Response
user_id: string username: string name: string team: integer score: integer drone_count: integer building_count: integer
Get the current scoreboard (public, no auth required)
Response
scoreboard: [array of {name, user_id, team, score}]
team_scores: {team_number: total_score}
Notes
Returns all players sorted by score, plus aggregate team scores. Team 0 (admins) is excluded from team_scores.
Game
/gameGame-wide information (fog-of-war safe)
Get the game clock: engine running state, current cycle, and cycle time
Response
running: boolean paused: boolean cycle_count: integer - current engine cycle cycle_time: float - seconds per cycle last_update: float - unix timestamp of the engine's last status write match_state: string - active | frozen | ended; actions are rejected with HTTP 423 while frozen/ended
Notes
Use this to pace polling and time multi-cycle actions instead of reading the engine_status piggybacked on GET /drones.
Drones
/dronesDrone listing and information
List drone IDs owned by current user (POST /drones/<drone_id>/status to queue a status report)
Response
drone_ids: [array of drone ID strings]
Queue a status action (1 battery, 1 cycle)
Response
action_id: string message: status action queued successfully
Notes
Status information is returned via message queue when action completes. Costs 1 battery and takes 1 cycle.
Drone Actions
/drones/<drone_id>/<equipment>Queue actions for drones. All actions return action_id on success.
Ammunition
1 endpointTransfer ammunition to adjacent friendly drone
Request Body
target_q: int (relative) target_r: int (relative) equipment_id: string level: int (1-3)
Example
{
"equipment_id": "uuid",
"level": 2,
"target_q": 1,
"target_r": 0
}
Notes
Transfers ammunition, howitzer shells, or howitzer charges to a friendly drone on an adjacent tile. The equipment moves with its current state (remaining rounds/charges). L1: 15 cycles, 1 batt/cycle. L2: 10 cycles, 2 batt/cycle. L3: 5 cycles, 6 batt/cycle. Target must be adjacent and on same team.
Auto-Cannon
3 endpointsFire an auto-cannon round at target coordinates or in a direction
Request Body
target_q: integer - relative Q offset from drone (required if no direction) target_r: integer - relative R offset from drone (required if no direction) direction: integer (0-5) - fire in a hex direction instead of at coordinates (required if no target_q/target_r) level: integer (1-3)
Example
{
"level": 2,
"target_q": 3,
"target_r": 0
}
Requires
Auto-Cannon equipment + Ammunition (loaded via autocannon_load)
Notes
Accepts EITHER (target_q, target_r) as relative coordinates OR a direction (0-5), not both. Direction mode fires along the hex direction (0=NE, 1=SE, 2=S, 3=SW, 4=NW, 5=N) to max range. Fires a projectile round that travels tile-by-tile along a hex line path. Accuracy starts at 75% at close range and falls to 20% at max range (capped at 95% with bonuses). AP rounds (50 dmg) ignore armour and disappear at max range on a miss. HE rounds (30 dmg + 15 splash) always explode at max range even on a miss, dealing splash to adjacent tiles. Canister rounds fire an instant cone of flechettes (range 3, 5 dmg/tile). Requires line of sight (except canister, which handles its own blocking). Min range: 2 tiles. 10-cycle cooldown between shots. All weapons receive +30% accuracy bonus against LUCAS drones.
Load ammunition into auto-cannon
Request Body
ammo_type: string (armour_piercing, high_explosive, or canister_round)
Example
{
"ammo_type": "armour_piercing"
}
Requires
Auto-Cannon equipment + Ammunition equipment
Notes
Takes 20 cycles to complete. The cannon must be loaded before it can fire. When a loaded ammo pack empties, another must be loaded. Valid ammo types: armour_piercing, high_explosive, canister_round. Canister rounds fire an instant cone of flechettes (range 3) along the line from drone to target.
Unload ammunition from auto-cannon
Requires
Auto-Cannon equipment with loaded ammunition
Notes
Takes 10 cycles to complete. Unloads the currently loaded ammunition pack from the cannon. The ammunition must be unloaded before it can be transferred to another drone via ammo transfer.
Decoy Beacon
1 endpointDeploy a decoy drone on an adjacent tile
Request Body
direction: integer (0-5, optional, default 0) - hex direction for target adjacent tile
Example
{
"direction": 2
}
Requires
Decoy Beacon equipment (unlock_decoy_beacon research completed, decoys remaining)
Notes
Deploys a decoy drone on an adjacent tile. The decoy appears on scans and DF as a real drone but has no equipment and minimal HP. Consumable — equipment is removed when all decoys are deployed. Deploy cycles and battery cost vary by level.
DF Antenna
5 endpointsDeploy the DF antenna (prevents movement)
Requires
DF Antenna equipment
Notes
Takes 10 cycles. Drone cannot turn, drive, or hover while deployed. Must stow before moving again.
Stow the DF antenna (re-enables movement)
Requires
DF Antenna equipment (deployed, antenna at height 0)
Notes
Takes 10 cycles. Antenna must be lowered to height 0 before stowing.
Raise the DF antenna mast
Request Body
target_height: integer (optional) - target antenna height (default: current + 5, max 20)
Example
{
"target_height": 10
}
Requires
DF Antenna equipment (deployed)
Notes
20 cycles per 5 units of height. Does NOT change drone elevation. Maximum antenna height is 20.
Lower the DF antenna mast
Request Body
target_height: integer (optional) - target antenna height (default: current - 5, min 0)
Example
{
"target_height": 0
}
Requires
DF Antenna equipment (deployed, height > 0)
Notes
20 cycles per 5 units of height. Must lower to 0 before stowing.
Configure DF antenna cone direction and width for passive EM detection
Request Body
direction: integer (0-5, required) - hex direction for cone center cone_width: integer (0-4, required) - 0=narrow line (±10°), 1=±30°, 2=±60°, 3=±120°, 4=360° level: integer (1-3, optional) - detection sensitivity level
Example
{
"cone_width": 2,
"direction": 1,
"level": 2
}
Requires
DF Antenna equipment (deployed)
Notes
Takes 1 cycle. Sets cone direction and width for passive EM monitoring. Once configured with antenna raised, the DF antenna passively detects electromagnetic signatures from drone actions within its cone each cycle. Detections are delivered as 'EM detection' messages with an 8-bin frequency spectrum and bearing direction. Levels: L1=30 range/threshold 3.0, L2=50 range/threshold 2.0, L3=75 range/threshold 1.0. LOS is checked at antenna height. Signature dampeners reduce detected signal strength. EM/DF antennas are LONG range (0-49 tiles at T0) — the primary strategic intelligence tool. Uses inverse square law decay: 1/(1 + d^2 * rate) with frequency-dependent attenuation (EM freq attenuation rate: 0.006). Higher frequencies fade faster at distance. Example T0 detection ranges: idle/deploy=0, driving=11, hovering=19, repair/charging=24-27, shield_gen=31, laser/mark=35, autocannon/missile=33-36, identify=38, scan/howitzer_fire=41, jammer=45, howitzer_aim/LUCAS_engine=49 tiles.
Drill
1 endpointMine resources from adjacent tile
Request Body
resource_q: integer (required) resource_r: integer (required) level: integer (1-3)
Example
{
"level": 2,
"resource_q": 15,
"resource_r": 22
}
Requires
Drill and Hopper equipment
Notes
Takes 10 cycles. Mines ore from an adjacent resource node into the drone's hopper.
Hopper
1 endpointDiscard resources from drone's hopper
Request Body
resource_type: string (optional) - specific resource to dump amount: integer (optional) - amount to dump
Example
{
"amount": 10,
"resource_type": "titanium_ore"
}
Requires
Hopper equipment with cargo
Notes
Takes 1 cycle, costs 0 battery. If resource_type and amount are omitted, dumps all resources. If only resource_type is specified, dumps all of that type.
Hover Tech
2 endpointsIncrease drone elevation
Request Body
target_elevation: integer (required) level: integer (1-3)
Example
{
"level": 2,
"target_elevation": 50
}
Requires
Hover Tech equipment
Notes
Elevation change per action must be 1-5. If the drone's elevation changed between queue and execution (e.g. from a prior queued action), the action will fail with 'Invalid elevation change'. WARNING: Drones at elevation > 0 drain battery each cycle to maintain hover. Drain scales with elevation and drone weight. If battery reaches 0, drone crashes and takes fall damage.
Decrease drone elevation
Request Body
target_elevation: integer (required) level: integer (1-3)
Example
{
"level": 1,
"target_elevation": 0
}
Requires
Hover Tech equipment
Notes
Elevation change per action must be 1-5. If the drone's elevation changed between queue and execution (e.g. from a prior queued action), the action will fail with 'Invalid elevation change'. Descending to elevation 0 stops hover battery drain. Recommended when low on battery to avoid crash damage.
Howitzer
6 endpointsDeploy the howitzer for firing (prevents movement)
Requires
Howitzer equipment (unlock_howitzer research completed, drone at elevation 0, not hovering)
Notes
Level-dependent: L1=8 cycles/1 batt/cycle, L2=5 cycles/2 batt/cycle, L3=3 cycles/3 batt/cycle. Drone cannot move, turn, hover, or take movement actions while deployed. Must stow before moving again. Cannot deploy while hovering. Cannot deploy inside a base (ground tiles are too hard to anchor the howitzer).
Stow the howitzer (re-enables movement)
Requires
Howitzer equipment (deployed)
Notes
Level-dependent: L1=8 cycles/1 batt/cycle, L2=5 cycles/2 batt/cycle, L3=3 cycles/3 batt/cycle. Re-enables movement after completion.
Load a howitzer shell into the breech
Request Body
level: integer (1-3)
Example
{
"level": 2
}
Requires
Howitzer equipment (deployed) + Howitzer Shells equipment
Notes
Consumes 1 shell from the Howitzer Shells equipment. Cycles: L1=8, L2=5, L3=3. Battery: L1=1/cycle, L2=2/cycle, L3=7/cycle.
Load propellant charges to set range
Request Body
charges: integer (1-3, required) - number of charges to load level: integer (1-3)
Example
{
"charges": 2,
"level": 2
}
Requires
Howitzer equipment (deployed, shell loaded) + Howitzer Charges equipment
Notes
Each charge adds +8 to min and max range. 1 charge: min 8/max 16. 2 charges: min 16/max 24. 3 charges: min 24/max 32. Consumes charges from Howitzer Charges equipment. Cycles: L1=8, L2=5, L3=3. Battery: L1=1/cycle, L2=2/cycle, L3=7/cycle.
Aim the howitzer at target coordinates
Request Body
target_q: integer (required) - relative Q offset from drone target_r: integer (required) - relative R offset from drone level: integer (1-3)
Example
{
"level": 2,
"target_q": 15,
"target_r": -10
}
Requires
Howitzer equipment (deployed, shell and charges loaded)
Notes
Aim speed: L1=2 cycles/tile, L2=1 cycle/tile, L3=1 cycle/tile. Battery: L1=1/cycle, L2=3/cycle, L3=8/cycle. Target must be within range determined by loaded charges. Coordinates are relative to drone position.
Fire the howitzer at the aimed target
Request Body
level: integer (1-3)
Example
{
"level": 2
}
Requires
Howitzer equipment (deployed, loaded, aimed)
Notes
Cycles: L1=8, L2=5, L3=3. Battery: L1=1/cycle, L2=2/cycle, L3=7/cycle. 10-cycle cooldown between shots. Accuracy: 30% direct hit, 30% scatter to adjacent tile, 30% scatter 2 tiles, 10% dud. Shell travels 2 tiles/cycle (8 tiles/second), ignores LOS (arcing). Damage: 100 direct, 50 splash ring 1, 25 splash ring 2. Buildings take 10% damage on direct hit only (no splash). Very loud seismic signature.
Jammer
6 endpointsDeploy the signal jammer (prevents movement)
Requires
Jammer equipment
Notes
Takes 10 cycles. Drone must be at elevation 0. Cannot turn, drive, or hover while deployed.
Stow the signal jammer (re-enables movement)
Requires
Jammer equipment (deployed, inactive, antenna at height 0)
Notes
Takes 10 cycles. Jammer must be deactivated and antenna lowered to 0 before stowing.
Raise the jammer antenna mast
Request Body
target_height: integer (optional) - target antenna height (default: current + 5, max 20)
Example
{
"target_height": 10
}
Requires
Jammer equipment (deployed)
Notes
20 cycles per 5 units of height. Maximum antenna height is 20.
Lower the jammer antenna mast
Request Body
target_height: integer (optional) - target antenna height (default: current - 5, min 0)
Example
{
"target_height": 0
}
Requires
Jammer equipment (deployed, inactive, height > 0)
Notes
20 cycles per 5 units of height. Jammer must be deactivated before lowering. Must lower to 0 before stowing.
Activate the signal jammer beam
Request Body
direction: integer (0-5, required) - hex direction for the jamming beam
Example
{
"direction": 1
}
Requires
Jammer equipment (deployed, antenna raised, sufficient battery)
Notes
Takes 1 cycle. Projects a beam that jams ACTION_COMPLETED and WARNING messages for drones in its path. Drains battery each cycle while active. Levels: L1=15 range/3 battery, L2=25 range/8 battery, L3=40 range/15 battery. Affects both friendly and enemy drones (except the jammer drone itself).
Deactivate the signal jammer
Requires
Jammer equipment (active)
Notes
Takes 1 cycle. Stops jamming and battery drain.
Land Mine
1 endpointDeploy a land mine at the drone's current tile
Requires
Land Mine equipment (unlock_land_mine research completed, drone at elevation 0, mines remaining)
Notes
Deploys a mine on the drone's current tile. Mines are invisible to scan but visible to identify. Detonation triggers: ground-level drone movement (drive), hover descent to elevation 0, fall damage landing, weapon hits (laser, missile, auto-cannon). Mines deal full damage to the triggering drone and splash damage to adjacent tiles (if upgraded). Equipment is removed when all mines are depleted. Deploy cycles and battery cost vary by level (L1: 20 cycles/1 battery per cycle, L2: 15 cycles/3 battery, L3: 5 cycles/10 battery). Upgrades reduce deploy cycles and increase mine count.
Laser Cannon
1 endpointFire laser cannon at target tile
Request Body
target_q: integer (required) target_r: integer (required) level: integer (1-3)
Example
{
"level": 3,
"target_q": 1,
"target_r": 0
}
Requires
Laser Cannon equipment
Notes
Targets relative coordinates (drone is at 0, 0). Engine auto-selects target: ground drones first, then elevated drones (by elevation), then buildings. Returns error if tile is empty. IMPORTANT: Lasers are top-mounted and cannot fire at targets below the attacker's height (terrain elevation + hover elevation).
Mobile Repair Kit
1 endpointRepair health or equipment at target coordinates
Request Body
target_q: integer (required)
target_r: integer (required)
level: integer (1-3)
repair_type: string ('health' or 'equipment', defaults to 'health')
equipment_id: string - full UUID (required if repair_type is 'equipment')
Example
{
"level": 2,
"target_q": 10,
"target_r": 20
}
Requires
Mobile Repair Kit equipment
Notes
Auto-targets at coordinates. For health: priority is ground drones, elevated drones, then buildings. For equipment: specify the full equipment_id UUID from the drone's equipment list. Equipment repair durability: L1=25, L2=50, L3=75.
Point Defense
1 endpointActivate point defense system for missile interception
Requires
Point Defense equipment (unlock_point_defense research completed)
Notes
Activates the PDS for the specified number of cycles (default 1), during which it intercepts incoming enemy missiles within range. Request body: {"cycles": int (optional, default 1)}. Interception chance: 30% per missile. Levels affect range and battery cost (L1: range 1/5 batt activate/30 per intercept, L2: range 2/10/25, L3: range 3/30/20).
Portable Charger
1 endpointTransfer battery to drone at target coordinates
Request Body
target_q: integer (required) target_r: integer (required) level: integer (1-3)
Example
{
"level": 1,
"target_q": 10,
"target_r": 20
}
Requires
Portable Charger equipment
Notes
Auto-targets drone at coordinates. Ground-level drones prioritized over elevated.
Propulsion
2 endpointsRotate drone left or right
Request Body
direction: integer (1=clockwise, -1=counter-clockwise) level: integer (1-3)
Example
{
"direction": 1,
"level": 2
}
Requires
Propulsion equipment
Move drone one tile forward or backward
Request Body
direction: integer (1=forward, -1=reverse) level: integer (1-3)
Example
{
"direction": 1,
"level": 2
}
Requires
Propulsion equipment
Notes
Hovering drones can fly over buildings if high enough: above elevation 5 for 1x1 buildings, above 10 for 2x2, above 15 for 3x3 (including Command Centers). Difficult terrain (terrain_type 2) doubles the number of cycles required for ground movement.
Sensors
2 endpointsScan nearby tiles for terrain, resources, and units
Request Body
level: integer (1-3)
Example
{
"level": 2
}
Requires
Sensors equipment
Notes
Returns tiles using relative coordinates where (0, 0) is the scanning drone's position. A tile at (1, -2) means 1 column east and 2 rows north of the drone.
Identify objects at target tile with detailed info
Request Body
target_q: integer (required) target_r: integer (required) level: integer (1-3)
Example
{
"level": 1,
"target_q": 2,
"target_r": -1
}
Requires
Sensors equipment
Notes
Targets relative coordinates (drone is at 0, 0). Returns detailed info about drones, buildings, and resources at that location. Target must be within sensor range.
Shield Generator
2 endpointsCharge drone's shields
Request Body
level: integer (1-3)
Example
{
"level": 2
}
Requires
Shield Generator equipment
Transfer shields to an adjacent drone
Request Body
target_q: integer (required) target_r: integer (required) level: integer (1-3, default 1)
Example
{
"level": 1,
"target_q": 10,
"target_r": 20
}
Requires
None (all drones can transfer shields)
Notes
All drones have base max shields of 50. Target must be adjacent and at same elevation. L1: 3 cycles/25 shields/5 battery, L2: 2 cycles/20 shields/10 battery, L3: 1 cycle/15 shields/15 battery. Shield Generator research adds shield_rate_bonus to transfer amount.
Smoke Launcher
1 endpointDeploy a smoke screen on the drone's current tile
Requires
Smoke Launcher equipment (unlock_smoke_launcher research completed, charges remaining)
Notes
Deploys a smoke screen on the drone's current tile and surrounding tiles (radius 1). Smoke blocks line-of-sight for scan and identify commands. Duration: 20 cycles. Consumable — equipment is removed when all charges are used. Deploy cycles and battery cost vary by level.
Targeting Computer
1 endpointMark enemy drone or building at coordinates for accuracy bonus
Request Body
target_q: integer (required) - Q coordinate of target tile target_r: integer (required) - R coordinate of target tile level: integer (1-3)
Example
{
"level": 2,
"target_q": -1,
"target_r": 1
}
Requires
Targeting Computer equipment
Notes
Uses relative coordinates (drone is at 0, 0). Automatically detects target at coordinates. Prioritizes ground drones over hover drones. If no drone found, marks building if present.
Wire-Guided Missile
1 endpointLaunch wire-guided missile at target tile
Request Body
target_q: integer (required) target_r: integer (required) level: integer 1-3 (optional, default 1) - L1: range 5, battery 10; L2: range 10, battery 20; L3: range 15, battery 30
Example
{
"level": 2,
"target_q": 3,
"target_r": -2
}
Requires
Wire-Guided Missile equipment
Notes
Missile travels tile-by-tile (default 2 cycles/tile). Level controls range and battery cost (L1: 5 range/10 battery, L2: 10/20, L3: 15/30). Drone cannot take other actions while guiding, EXCEPT mark which redirects the missile to a new target (requires targeting computer). If drone is destroyed, missile is lost. Targets at location receive warning.
Drone Warnings
/drones/<drone_id>/warningsConfigure automated warning thresholds for drone stats. When a stat drops below the configured percentage, a WARNING message is delivered via the message queue. Warnings fire once per threshold crossing and reset when the stat recovers above the threshold.
Get warning thresholds for a drone
Response
drone_id: string
thresholds: {battery: int, health: int, shields: int, equipment: int} (only set keys present)
Set warning thresholds for a drone
Request Body
battery: integer (0-100, optional) - battery percentage threshold health: integer (0-100, optional) - health percentage threshold shields: integer (0-100, optional) - shield percentage threshold equipment: integer (0-100, optional) - equipment durability percentage threshold (triggers when ANY equipped item drops below)
Example
{
"battery": 20,
"equipment": 25,
"health": 30,
"shields": 50
}
Notes
Values are percentages (0-100). Null or missing keys disable that warning type. Equipment warnings trigger when any single equipped item's durability percentage drops below the threshold. The warning message identifies which specific items are below threshold.
Remove all warning thresholds for a drone
Response
drone_id: string message: Warning thresholds removed
Building Warnings
/buildings/<building_id>/warningsConfigure automated warning thresholds for building stats. Supports health and shields for all buildings, plus storage thresholds for Silos and Refiners. 'Below' warnings fire when a value drops below the threshold; 'above' warnings fire when a value rises above the threshold. Warnings fire once per crossing and reset when the value returns past the threshold.
Get warning thresholds for a building
Response
building_id: string
thresholds: {health: int, shields: int, ...} (only set keys present)
Set warning thresholds for a building
Request Body
health: integer (0-100, optional) - health percentage threshold (below) shields: integer (0-100, optional) - shield percentage threshold (below) storage_above: integer (0-100, optional, Silo only) - warn when storage goes above this % storage_below: integer (0-100, optional, Silo only) - warn when storage drops below this % ore_storage_above: integer (0-100, optional, Refiner only) - warn when ore storage goes above this % ore_storage_below: integer (0-100, optional, Refiner only) - warn when ore storage drops below this % resource_storage_above: integer (0-100, optional, Refiner only) - warn when resource storage goes above this % resource_storage_below: integer (0-100, optional, Refiner only) - warn when resource storage drops below this %
Example
{
"health": 30,
"shields": 50,
"storage_below": 10
}
Notes
Values are percentages (0-100). Valid keys depend on the building type: all buildings support health and shields; Silos also support storage_above and storage_below; Refiners also support ore_storage_above, ore_storage_below, resource_storage_above, and resource_storage_below. Unknown keys for the building type are rejected.
Remove all warning thresholds for a building
Response
building_id: string message: Warning thresholds removed
Buildings
/buildingsBuilding listing and information
List building IDs owned by current user (POST /buildings/<building_id>/common/status to queue a status report)
Response
building_ids: [array of building ID strings]
Queue a status action (1 power, 1 cycle)
Request Body
efficiency: float (0.01-1.0, optional)
Response
action_id: string message: status action queued successfully
Notes
Status information is returned via message queue when action completes. Coordinates are relative to the building's origin (top-left tile), where (0, 0) is the origin. Costs 1 power and takes 1 cycle (adjusted by efficiency). Solar panels include: direction (0-359), tilt (0-90), base_power, buffer, max_buffer, current_power, solar_efficiency.
Common
1 endpointSelf-repair building health
Request Body
efficiency: float (0.01-1.0, optional)
Example
{
"efficiency": 1.0
}
Notes
All buildings can self-repair. Costs 3 titanium_parts + 1 battery_materials from command center (consumed immediately when queued). Takes 20 cycles, heals 50 HP (capped at max health). Power cost: 2.5/cycle (50 total at efficiency 1.0). Requires a functional command center with sufficient resources.
Building Actions
/buildings/<building_id>/<type>Queue actions for buildings. All require efficiency (0.01-1.0) parameter.
Charging Station
1 endpointCharge a drone at charging station
Request Body
q: integer (required) - drone hex Q coordinate r: integer (required) - drone hex R coordinate efficiency: float (0.01-1.0)
Example
{
"efficiency": 1.0,
"q": 50,
"r": 35
}
Building Type
Drone Charging Station
Notes
Takes 10 cycles. Drone is identified by its position. Server resolves the drone_id from q/r coordinates.
Command Center
5 endpointsBuild a new building
Request Body
building_type: string (required) target_q: integer (required) target_r: integer (required) efficiency: float (0.01-1.0)
Example
{
"building_type": "laser_turret",
"efficiency": 1.0,
"target_q": 25,
"target_r": 30
}
Building Type
Command Center
Notes
Building types: solar_panel_array, refiner, drone_charging_station, drone_production_plant, drone_equipment_production_plant, drone_repair_station, laser_turret, missile_turret, auto_cannon_turret, silo, battery_array, shield_array, sensor_array, point_defense_system, lucas_launcher
Get comprehensive status report of all drones and buildings
Request Body
efficiency: float (0.01-1.0, optional)
Example
{
"efficiency": 1.0
}
Building Type
Command Center
Notes
Automatically finds user's command center. Returns full report of all owned drones (including those outside base), all buildings, adjacent tile info, and summary stats. All coordinates are relative to the command center's origin (top-left tile), where (0, 0) is the origin. For a 3x3 command center, this is the top-left corner, not the center tile. Costs 5 power.
Get upgrade status and available upgrades for your team
Response
available_upgrades: [array of available upgrades]
current_upgrades: {equipment_type: level}
active_research: {current research info or null}
Building Type
Command Center
Notes
Shows all upgrades your team can research, current upgrade levels, and any research in progress
Start researching an equipment upgrade
Request Body
equipment_type: string (required) efficiency: float (0.01-1.0)
Example
{
"efficiency": 1.0,
"equipment_type": "drill"
}
Building Type
Command Center
Notes
Requires resources in command center. Research takes many cycles to complete. Only one research can be active at a time per team. Queue this action each cycle to progress research. Valid equipment_type values: drill, sensors, battery, portable_charger, reactive_armour, hopper, mobile_repair_kit, shield_generator, laser_cannon, propulsion, hover_tech, targeting_computer, wire_guided_missile, auto_cannon, df_antenna, jammer, land_mine, signature_dampener, decoy_beacon, smoke_launcher, point_defense, seismic_sensor, ammunition, howitzer, howitzer_shells, howitzer_charges, baseline_drone, unlock_reactive_armour, unlock_hover_tech, unlock_wire_guided_missile, unlock_auto_cannon, unlock_shield_generator, unlock_targeting_computer, unlock_df_antenna, unlock_jammer, unlock_seismic_sensor, unlock_land_mine, unlock_signature_dampener, unlock_decoy_beacon, unlock_smoke_launcher, unlock_point_defense, unlock_howitzer. The baseline_drone type upgrades the drone chassis itself (health, battery, equipment slots, shields) rather than a specific equipment piece. The unlock_* types are single-tier research that enables building advanced equipment at the Equipment Production Plant.
Cancel active research (resources NOT refunded)
Request Body
efficiency: float (0.01-1.0)
Example
{
"efficiency": 1.0
}
Building Type
Command Center
Notes
Cancels research in progress. Resources spent to start research are lost.
Equipment Plant
2 endpointsInstall equipment on drone
Request Body
q: integer (required) - drone hex Q coordinate r: integer (required) - drone hex R coordinate equipment_type: string (required) efficiency: float (0.01-1.0)
Example
{
"efficiency": 1.0,
"equipment_type": "laser_cannon",
"q": 50,
"r": 35
}
Building Type
Drone Equipment Production Plant
Notes
Takes 25 cycles. Drone is identified by its position. Server resolves the drone_id from q/r coordinates.
Remove equipment from drone
Request Body
q: integer (required) - drone hex Q coordinate r: integer (required) - drone hex R coordinate equipment_index: integer (required) efficiency: float (0.01-1.0)
Example
{
"efficiency": 1.0,
"equipment_index": 0,
"q": 50,
"r": 35
}
Building Type
Drone Equipment Production Plant
Notes
Takes 25 cycles. Drone is identified by its position. Server resolves the drone_id from q/r coordinates.
LUCAS Launcher
2 endpointsLaunch a LUCAS drone at target coordinates
Request Body
target_q: integer (required, relative to building) target_r: integer (required, relative to building) efficiency: float (0.01-1.0)
Example
{
"efficiency": 1.0,
"target_q": 30,
"target_r": -15
}
Building Type
LUCAS Launcher
Notes
Launches a stored LUCAS drone at the target tile. The drone flies at elevation 30, speed 1 tile per 3 cycles. Takes 25 cycles to launch (500 power at max efficiency). Only 1 LUCAS drone may be in flight per launcher. Must have a stored LUCAS drone (built via manufacture endpoint). Target must be within 3 tiles of the nearest enemy base edge. LUCAS drones emit seismic signatures only on launch and impact (they are airborne during flight, so no ground vibration). LUCAS drones emit strong EM signatures continuously during flight (guidance/propulsion electronics). All weapons receive +30% accuracy bonus against LUCAS drones. Max flight time: 500 cycles. If the launcher is destroyed, the in-flight drone loses guidance and falls. Coordinates are relative to the building origin.
Redirect an in-flight LUCAS drone to new target
Request Body
target_q: integer (required, relative to building) target_r: integer (required, relative to building) efficiency: float (0.01-1.0)
Example
{
"efficiency": 1.0,
"target_q": 40,
"target_r": -20
}
Building Type
LUCAS Launcher
Notes
Redirects the currently in-flight LUCAS drone to new target coordinates. Cannot redirect a LUCAS drone that is already falling. New target must be within 3 tiles of the nearest enemy base edge. Coordinates are relative to the building origin.
Point Defense System
1 endpointActivate building point defense system
Request Body
efficiency: float (0.01-1.0) cycles: integer (optional, default 1)
Example
{
"cycles": 10,
"efficiency": 1.0
}
Building Type
Point Defense System
Notes
Activates the building PDS for the specified number of cycles (default 1) to intercept incoming enemy missiles within 8-tile interception range. Each missile has a 30% chance of being intercepted. The PDS re-activates automatically each cycle until the specified cycles are exhausted. If power is lost, the action pauses and resumes when power returns.
Production
1 endpointBuild a drone or equipment (unified endpoint)
Request Body
efficiency: float (0.01-1.0) equipment_type: string (required for equipment plant only)
Example
{
"efficiency": 1.0,
"equipment_type": "laser_cannon"
}
Building Type
Drone Production Plant, Drone Equipment Production Plant, LUCAS Launcher
Notes
For Drone Production Plant: builds a new drone. For Equipment Plant: requires equipment_type. For LUCAS Launcher: builds a LUCAS attack drone (stored internally, max 4). Equipment types: drill, sensors, battery, portable_charger, reactive_armour, hopper, mobile_repair_kit, shield_generator, laser_cannon, propulsion, hover_tech, targeting_computer, wire_guided_missile, auto_cannon, df_antenna, jammer, land_mine, signature_dampener, decoy_beacon, smoke_launcher, point_defense, seismic_sensor, armour_piercing_ammunition, high_explosive_ammunition, canister_round_ammunition, howitzer, howitzer_shells, howitzer_charges. Note: Advanced equipment (reactive_armour, hover_tech, wire_guided_missile, auto_cannon, all ammunition types, shield_generator, targeting_computer, df_antenna, jammer, seismic_sensor, land_mine, signature_dampener, decoy_beacon, smoke_launcher, point_defense, howitzer + howitzer_shells + howitzer_charges) requires unlock research at the Command Center before it can be built. See equipment_unlock_research in the upgrades section.
Refiner
1 endpointProcess ore into refined materials
Request Body
efficiency: float (0.01-1.0) ore_type: string (optional)
Example
{
"efficiency": 1.0,
"ore_type": "titanium_ore"
}
Building Type
Refiner
Notes
Takes 1 cycle per ore unit (at efficiency 1.0). Processes ore from the refiner's input storage into refined materials.
Repair Station
2 endpointsRepair drone at repair station
Request Body
q: integer (required) - drone hex Q coordinate r: integer (required) - drone hex R coordinate efficiency: float (0.01-1.0)
Example
{
"efficiency": 1.0,
"q": 50,
"r": 35
}
Building Type
Drone Repair Station
Notes
Drone is identified by its position. Server resolves the drone_id from q/r coordinates.
Repair equipment durability on a drone
Request Body
q: integer (required) - drone hex Q coordinate r: integer (required) - drone hex R coordinate equipment_id: string - full UUID (required) efficiency: float (0.01-1.0)
Example
{
"efficiency": 1.0,
"equipment_id": "4aac1f00-a1b2-4c3d-8e5f-1234567890ab",
"q": 50,
"r": 35
}
Building Type
Drone Repair Station
Notes
Drone is identified by its position. Restores up to 50 durability per repair action, capped at equipment's max durability. Cannot repair destroyed equipment (durability 0).
Resource Transfer
2 endpointsTransfer resources from building to drone (unified endpoint)
Request Body
q: integer (required) - drone hex Q coordinate r: integer (required) - drone hex R coordinate efficiency: float (0.01-1.0) resource_type: string (optional, transfers all valid types if omitted) amount: integer (optional, transfers max if omitted)
Example
{
"amount": 20,
"efficiency": 1.0,
"q": 50,
"r": 35,
"resource_type": "titanium_parts"
}
Building Type
Refiner, Silo, DroneProductionPlant, DroneEquipmentProductionPlant, CommandCenter, LucasLauncher
Notes
Takes 5 cycles. Unified endpoint for all building-to-drone transfers. Drone is identified by position. Drone must have hopper equipment and be within range of the building.
Transfer resources from drone to building (unified endpoint)
Request Body
q: integer (required) - drone hex Q coordinate r: integer (required) - drone hex R coordinate efficiency: float (0.01-1.0) resource_type: string (optional, transfers all valid types if omitted) amount: integer (optional, some buildings support this)
Example
{
"efficiency": 1.0,
"q": 50,
"r": 35,
"resource_type": "titanium_ore"
}
Building Type
Refiner, Silo, DroneProductionPlant, DroneEquipmentProductionPlant, CommandCenter, LucasLauncher
Notes
Takes 5 cycles. Unified endpoint for all drone-to-building transfers. Drone is identified by position. Drone must have hopper equipment and be within range of the building.
Sensor Array
2 endpointsScan nearby tiles for terrain, resources, and units
Request Body
efficiency: float (0.01-1.0)
Example
{
"efficiency": 1.0
}
Building Type
Sensor Array
Notes
Scans a 20-tile radius around the sensor array, revealing terrain, resources, drones, and buildings. The sensor array is elevated high enough to bypass all line-of-sight checks. Returns results via message queue using coordinates relative to the building's position.
Identify objects at a specific tile with detailed info
Request Body
q: integer (required, relative to building) r: integer (required, relative to building) efficiency: float (0.01-1.0)
Example
{
"efficiency": 1.0,
"q": 5,
"r": -3
}
Building Type
Sensor Array
Notes
Identifies any tile within 20-tile range, returning detailed information about terrain, resources, buildings, and drones at that location. The sensor array is elevated high enough to bypass all line-of-sight checks. Coordinates are relative to the sensor array's position.
Shield Array
3 endpointsGenerate shields in shield array
Request Body
efficiency: float (0.01-1.0)
Example
{
"efficiency": 1.0
}
Building Type
Shield Array
Transfer shields to another building
Request Body
target_building_id: string (required) efficiency: float (0.01-1.0) amount: integer (optional)
Example
{
"amount": 50,
"efficiency": 1.0,
"target_building_id": "command-center-1"
}
Building Type
Shield Array
Transfer shields from shield array to a drone
Request Body
q: integer (required) - drone hex Q coordinate r: integer (required) - drone hex R coordinate efficiency: float (0.01-1.0) amount: integer (optional)
Example
{
"amount": 25,
"efficiency": 1.0,
"q": 50,
"r": 35
}
Building Type
Shield Array
Notes
Transfers shield power from buffer to target drone. Drone is identified by position.
Solar Panel
1 endpointReposition solar panel direction and tilt
Request Body
direction: float (required, 0-359 degrees) - azimuth direction tilt: float (optional, 0-90 degrees) - elevation angle (0=horizon, 90=straight up). Defaults to current tilt if omitted. efficiency: float (0.01-1.0)
Example
{
"direction": 180.0,
"efficiency": 0.5,
"tilt": 45.0
}
Building Type
Solar Panel Array
Notes
Panel efficiency uses 3D dot-product: panel and sun orientations are converted to unit vectors and efficiency = max(0, dot(panel, sun)) * brightness. A sun below the horizon (elevation <= 0) contributes 0 power. Both suns can set, creating true nighttime.
Turrets
5 endpointsFire turret at target (unified endpoint for all turret types)
Request Body
q: integer (required) - target hex Q coordinate r: integer (required) - target hex R coordinate efficiency: float (0.01-1.0)
Example
{
"efficiency": 1.0,
"q": 50,
"r": 35
}
Building Type
Laser Turret / Missile Turret / Auto-Cannon Turret
Notes
Server determines turret type from the building. All turret types use the same q/r target interface. Laser Turret: fires laser at target position. Missile Turret: launches a missile at target; missile travels tile-by-tile (2 cycles/tile), fails if turret destroyed mid-flight, cannot be redirected. Auto-Cannon Turret: fires 2 rounds of active ammo type at target; must reload first. Ammo types: armour_piercing (50 dmg, ignores armour), high_explosive (30 dmg + 15 splash), canister_round (instant cone, 5 dmg/tile). Accuracy: 75%-20% by range, capped at 95%. All weapons receive +30% accuracy bonus against LUCAS drones. Min range: 2 tiles.
Reload turret ammunition
Request Body
ammo_type: string (optional) - required for auto-cannon turret: armour_piercing, high_explosive, canister_round efficiency: float (0.01-1.0)
Example
{
"ammo_type": "armour_piercing",
"efficiency": 1.0
}
Building Type
Missile Turret / Auto-Cannon Turret
Notes
Replenishes ammunition. Costs resources from command center. For auto-cannon, also sets active ammo type. Missile turret reload: 8 titanium_parts + 12 battery_materials. Auto-cannon reload: 4 titanium_parts + 4 battery_materials.
Scan area with turret sensors
Request Body
efficiency: float (0.01-1.0)
Example
{
"efficiency": 0.5
}
Building Type
Laser Turret / Missile Turret / Auto-Cannon Turret
Notes
Scans a 15-tile radius around the turret. Coordinates in results are relative to the building's position.
Identify target at position with turret
Request Body
q: integer (required) - target hex Q coordinate r: integer (required) - target hex R coordinate efficiency: float (0.01-1.0)
Example
{
"efficiency": 0.75,
"q": 50,
"r": 35
}
Building Type
Laser Turret / Missile Turret / Auto-Cannon Turret
Notes
Target must be within 15-tile range. Target is identified by position. Returns detailed info about drone at that location.
Mark target at position with turret
Request Body
q: integer (required) - target hex Q coordinate r: integer (required) - target hex R coordinate efficiency: float (0.01-1.0)
Example
{
"efficiency": 1.0,
"q": 50,
"r": 35
}
Building Type
Laser Turret / Missile Turret / Auto-Cannon Turret
Notes
Target must be within 15-tile range. Target is identified by position. Marks drone at location for accuracy bonus. For missile turrets: if missiles are in flight, mark redirects all in-flight missiles to the new target.
Action Queue
/queueView and manage queued actions
Get all queued drone actions
Response
actions: [array of action objects]
Get all queued building actions
Response
actions: [array of action objects]
Cancel a queued drone action
Cancel a queued building action
Clear all drone and building action queues
Response
message: All queues cleared
Messages
/messagesRetrieve game messages and notifications. Messages are limited to the last 100 per user.
Get messages
Query Parameters
count: integer (optional, returns all if not specified) consume: boolean (optional, default: false)
Response
messages: [array of message objects] count: integer
Get message count
Response
count: integer
Clear all messages
HTTP Status Codes
| Code | Description |
|---|---|
| 200 | Success |
| 201 | Action queued successfully |
| 400 | Bad request / Action rejected |
| 401 | Unauthorized (missing or invalid token) |
| 403 | Forbidden (resource not owned by user) |
| 404 | Resource not found |
Error Response Format
Error responses follow this format
Example
{
"error": {
"code": "DRONE_NOT_FOUND",
"message": "Drone not found",
"details": {'drone_id': 'abc123'}
}
}