@spacemolt/lib 14.2.1 → 15.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -224,7 +224,7 @@ export type ArenaChallengeDefInfo = {
224
224
  */
225
225
  description: string;
226
226
  /**
227
- * The enemy ships spawned for the fight, one entry per line of the definition.
227
+ * The enemy ships spawned when the fight starts, one entry per line of the definition. Reinforcement waves are listed separately in waves.
228
228
  */
229
229
  enemies: Array<ArenaEnemyInfo>;
230
230
  /**
@@ -235,6 +235,10 @@ export type ArenaChallengeDefInfo = {
235
235
  * Display name of the challenge.
236
236
  */
237
237
  name: string;
238
+ /**
239
+ * How the fight is won beyond knocking out every enemy. Every zero or omitted field is off, so an all-zero objective means the last side standing wins.
240
+ */
241
+ objective: ArenaObjective;
238
242
  /**
239
243
  * Arena POI the fight is held at. You must be undocked there to start it.
240
244
  */
@@ -259,6 +263,10 @@ export type ArenaChallengeDefInfo = {
259
263
  * Position within the series, from 1. Higher stages are harder.
260
264
  */
261
265
  stage: number;
266
+ /**
267
+ * Reinforcements that join the enemy side mid-match, in arrival order. Empty when the opening enemies are the whole fight.
268
+ */
269
+ waves: Array<ArenaWaveInfo>;
262
270
  /**
263
271
  * Times you have won this challenge. 0 until your first win.
264
272
  */
@@ -344,6 +352,10 @@ export type ArenaEnemyInfo = {
344
352
  * How many ships of this line the challenge spawns. Always at least 1.
345
353
  */
346
354
  count: number;
355
+ /**
356
+ * True when this line runs for the ring beacons instead of fighting. It takes the flee stance from its first tick, and a challenge whose objective sets no_enemy_escape is lost the moment one gets away — stop it with damage or warp tackle.
357
+ */
358
+ flees: boolean;
347
359
  /**
348
360
  * True for the named headline enemy of the fight. Your ship opens targeting the boss when there is one.
349
361
  */
@@ -375,7 +387,7 @@ export type ArenaFightResponse = {
375
387
  */
376
388
  challenge_id: string;
377
389
  /**
378
- * The enemy lines of the challenge, as listed by arena action=challenges.
390
+ * The enemy lines the challenge opens with, as listed by arena action=challenges. Reinforcement waves are not spawned yet and are listed in waves.
379
391
  */
380
392
  enemies: Array<ArenaEnemyInfo>;
381
393
  /**
@@ -390,20 +402,62 @@ export type ArenaFightResponse = {
390
402
  * Display name of the challenge.
391
403
  */
392
404
  name: string;
405
+ /**
406
+ * How this fight is won beyond knocking out every enemy. Every zero or omitted field is off. Track it live with arena action=status.
407
+ */
408
+ objective: ArenaObjective;
393
409
  /**
394
410
  * Every combatant in the match at the moment it started, your side and the enemies. Enemy entries carry the spawned NPC's id as player_id.
395
411
  */
396
412
  participants: Array<ArenaParticipantInfo>;
413
+ /**
414
+ * Reinforcements that will join the enemy side later in this match, in arrival order. Empty when the opening enemies are the whole fight.
415
+ */
416
+ waves: Array<ArenaWaveInfo>;
397
417
  /**
398
418
  * Your battle side ID. Fleet members share it.
399
419
  */
400
420
  your_side: number;
401
421
  };
422
+ export type ArenaMatchInfo = {
423
+ /**
424
+ * ID of the NPC challenge being fought.
425
+ */
426
+ challenge_id: string;
427
+ /**
428
+ * Ticks since the match started. 0 on the tick it began.
429
+ */
430
+ elapsed_ticks: number;
431
+ /**
432
+ * Challenge enemies still in the fight. Reinforcement waves that have not arrived yet are not counted.
433
+ */
434
+ enemies_remaining: number;
435
+ /**
436
+ * Display name of the challenge.
437
+ */
438
+ name: string;
439
+ /**
440
+ * The challenge's win condition, as listed by arena action=challenges. Every zero or omitted field is off.
441
+ */
442
+ objective: ArenaObjective;
443
+ /**
444
+ * Ticks left before the objective's survive_ticks or time_limit_ticks deadline resolves the match. Omitted when the challenge sets neither; 0 means the deadline falls this tick.
445
+ */
446
+ ticks_remaining?: number;
447
+ /**
448
+ * Reinforcement waves that have not arrived yet. The match cannot end while one is still due and your side is still standing.
449
+ */
450
+ waves_remaining: number;
451
+ };
402
452
  export type ArenaNpcInfo = {
403
453
  /**
404
454
  * ID of the arena match the enemy is fighting in. Enemies exist only for the length of their match.
405
455
  */
406
456
  battle_id: string;
457
+ /**
458
+ * True when the enemy is running for the ring beacons instead of fighting. Its challenge is lost the moment it gets away.
459
+ */
460
+ flees: boolean;
407
461
  /**
408
462
  * Current hull points.
409
463
  */
@@ -453,6 +507,38 @@ export type ArenaNpcInfo = {
453
507
  */
454
508
  status?: string;
455
509
  };
510
+ export type ArenaObjective = {
511
+ /**
512
+ * True when an enemy that escapes the ring loses you the match. Challenges that set it spawn at least one enemy that runs from the first tick (flees on its enemy line); stop it with damage or warp tackle. Omitted = an enemy that breaks contact is simply out of the fight.
513
+ */
514
+ no_enemy_escape?: boolean;
515
+ /**
516
+ * Ticks your side must last to win, counted from the first tick of the match. The match ends the moment you reach it and any enemy still standing is called off. Omitted or 0 = you win by knocking out every enemy instead.
517
+ */
518
+ survive_ticks?: number;
519
+ /**
520
+ * Ticks you have to knock out every enemy. The match is lost the moment you reach it with one still standing. Omitted or 0 = no time limit.
521
+ */
522
+ time_limit_ticks?: number;
523
+ };
524
+ export type ArenaObjectiveEnemy = {
525
+ /**
526
+ * True when this enemy runs for the ring beacons instead of fighting. Letting one escape loses a challenge whose objective sets no_enemy_escape.
527
+ */
528
+ flees: boolean;
529
+ /**
530
+ * Display name of the enemy. Copies of a multi-ship line are numbered (Ring Cleaver 1, Ring Cleaver 2).
531
+ */
532
+ name: string;
533
+ /**
534
+ * Combat ID of the enemy: the player_id it carries in battle payloads and the id to pass to the battle command as a target.
535
+ */
536
+ npc_id: string;
537
+ /**
538
+ * Ship class ID of the enemy hull.
539
+ */
540
+ ship_class: string;
541
+ };
456
542
  export type ArenaParticipantInfo = {
457
543
  /**
458
544
  * Player ID.
@@ -636,6 +722,10 @@ export type ArenaStatusResponse = {
636
722
  * A challenge waiting for your answer. Omitted when none is pending.
637
723
  */
638
724
  incoming?: ArenaChallengeInfo;
725
+ /**
726
+ * Live objective state of the NPC challenge you are fighting. Omitted when you are not in a challenge match — a player duel has no objective.
727
+ */
728
+ match?: ArenaMatchInfo;
639
729
  /**
640
730
  * A challenge you issued that is still unanswered. Omitted when none is pending.
641
731
  */
@@ -651,6 +741,24 @@ export type ArenaStatusResponse = {
651
741
  [key: string]: number;
652
742
  };
653
743
  };
744
+ export type ArenaWaveInfo = {
745
+ /**
746
+ * Ticks into the match before the wave can arrive. Omitted or 0 = no time trigger.
747
+ */
748
+ after_ticks?: number;
749
+ /**
750
+ * The enemy ships the wave brings, one entry per line of the definition.
751
+ */
752
+ enemies: Array<ArenaEnemyInfo>;
753
+ /**
754
+ * Display name of the wave, announced in the arena_objective push frame when it arrives.
755
+ */
756
+ name: string;
757
+ /**
758
+ * Enemies that must be left standing before the wave can arrive. Omitted = no count trigger; 0 = only once you have cleared the ring.
759
+ */
760
+ when_enemies_remaining?: number;
761
+ };
654
762
  export type ArenaXpLedger = {
655
763
  by_skill: {
656
764
  [key: string]: number;
@@ -881,7 +989,7 @@ export type BattleCombatState = {
881
989
  */
882
990
  flee_counter: number;
883
991
  /**
884
- * Flee ticks needed to escape under current conditions (slower-than-pursuer and webbing raise it). Omitted while escape progress is blocked — by warp disruption or by a boarding intercept alike — so its absence does not identify which. Read warp_disrupted and intercepted for that.
992
+ * Flee ticks needed to escape under current conditions. 3 ticks is the baseline, and the combat-speed gap to the fastest enemy ship moves it either way: being slower (or webbed) raises it, being faster lowers it, with a floor of 1. Omitted while escape progress is blocked — by warp disruption or by a boarding intercept alike — so its absence does not identify which. Read warp_disrupted and intercepted for that.
885
993
  */
886
994
  flee_required?: number;
887
995
  /**
@@ -904,6 +1012,10 @@ export type BattleCombatState = {
904
1012
  * player_id of the boarder intercepting you, matching a participant row in the same get_battle_status response. Present exactly when intercepted is true. At most one hull can intercept you: a ship already in a boarding link cannot open a second one.
905
1013
  */
906
1014
  interceptor_id?: string;
1015
+ /**
1016
+ * Whether your own boarding latch is gaining ground, and what is stopping it when it is not. accruing: you hold point-blank contact with the target's shields suppressed, so latch progress accrues this tick. shields_holding: the target's shields have regenerated back above the suppression line, so the latch reverts instead of advancing — keep its shields down to reopen the gate. out_of_range: you are not in point-blank contact, so the latch reverts — close the gap first, because suppressing shields does nothing at range. Present only while you are latching onto a target; omitted once marines are aboard, and omitted for the ship being boarded.
1017
+ */
1018
+ latch_status?: 'accruing' | 'shields_holding' | 'out_of_range';
907
1019
  /**
908
1020
  * Largest zone distance any fitted weapon can fire against your selected target after its targeting-range reductions. A target whose zone_distance exceeds this is out of range.
909
1021
  */
@@ -1014,6 +1126,9 @@ export type BattleParticipant = {
1014
1126
  */
1015
1127
  shield_pct?: number;
1016
1128
  ship_class?: string;
1129
+ /**
1130
+ * Display name of whatever this combatant is flying: a ship reports its custom name when one is set and otherwise its class display name, a drone reports its drone type, and a creature reports its species role. Omitted for stations, which have no hull, and when the combatant ship cannot be resolved.
1131
+ */
1017
1132
  ship_name?: string;
1018
1133
  side_id: number;
1019
1134
  /**
@@ -1047,6 +1162,9 @@ export type BattleParticipantInfo = {
1047
1162
  player_id: string;
1048
1163
  shield_pct?: number;
1049
1164
  ship_class?: string;
1165
+ /**
1166
+ * Display name of the ship this combatant is flying: its custom name when one is set, otherwise the ship class display name. Omitted for combatants that are not flying a resolvable ship, such as stations, drones, and creatures.
1167
+ */
1050
1168
  ship_name?: string;
1051
1169
  side_id: number;
1052
1170
  stance?: string;
@@ -1214,7 +1332,7 @@ export type BoardingStateLogEntry = {
1214
1332
  */
1215
1333
  destroyed?: boolean;
1216
1334
  /**
1217
- * Observable boarding transition. Terminal values include capture_ready; plundered; withdrawn; attacker_destroyed; attacker_incapacitated; target_destroyed; target_self_destructed; and restart_canceled. plundered means pirates removed eligible cargo and then disengaged without taking the hull.
1335
+ * Observable boarding transition. Terminal values include capture_ready; plundered; withdrawn; closing_stalled; attacker_destroyed; attacker_incapacitated; target_destroyed; target_self_destructed; and restart_canceled. plundered means pirates removed eligible cargo and then disengaged without taking the hull. closing_stalled means a latch with zero progress was withdrawn after the battle sat idle for the whole stalemate window.
1218
1336
  */
1219
1337
  event: string;
1220
1338
  /**
@@ -1491,6 +1609,21 @@ export type BulkModifyOrdersResponse = {
1491
1609
  results: Array<BulkModifyOrderResult>;
1492
1610
  summary: BulkSummary;
1493
1611
  };
1612
+ export type BulkReloadResponse = {
1613
+ action: 'reload';
1614
+ message?: string;
1615
+ mode: 'bulk';
1616
+ results: Array<BulkReloadResult>;
1617
+ summary: BulkSummary;
1618
+ };
1619
+ export type BulkReloadResult = {
1620
+ error?: string;
1621
+ error_code?: string;
1622
+ index: number;
1623
+ result?: ReloadResponse;
1624
+ success: boolean;
1625
+ weapon_id: string;
1626
+ };
1494
1627
  export type BulkSellOrderResult = {
1495
1628
  consolidated?: boolean;
1496
1629
  error?: string;
@@ -1704,6 +1837,26 @@ export type CaptureLogEntry = {
1704
1837
  captor_username: string;
1705
1838
  former_owner_id: string;
1706
1839
  former_owner_username: string;
1840
+ /**
1841
+ * Prize created for the captured hull. Omitted on historical rows recorded before prize location was carried and on arena captures, which create no prize.
1842
+ */
1843
+ prize_id?: string;
1844
+ /**
1845
+ * POI where the prize sits (the battle origin, which can differ from the captor's POI). Omitted when there is no prize, the POI is hidden, or the battle began in transit.
1846
+ */
1847
+ prize_poi_id?: string;
1848
+ /**
1849
+ * Display name of the prize POI. Omitted when unknown or hidden.
1850
+ */
1851
+ prize_poi_name?: string;
1852
+ /**
1853
+ * System where the prize sits. Omitted when there is no prize.
1854
+ */
1855
+ prize_system_id?: string;
1856
+ /**
1857
+ * Display name of the prize system. Omitted when unknown.
1858
+ */
1859
+ prize_system_name?: string;
1707
1860
  ship_class: string;
1708
1861
  ship_id: string;
1709
1862
  };
@@ -1787,11 +1940,70 @@ export type CatalogDump = {
1787
1940
  * Regular items and modules merged into one list, sorted by ID.
1788
1941
  */
1789
1942
  items: Array<Item | Module>;
1790
- recipes: Array<Recipe>;
1943
+ mining: MiningConstants;
1944
+ recipes: Array<CatalogRecipe>;
1791
1945
  ships: Array<ShipClass>;
1792
1946
  skills: Array<SkillDefinition>;
1793
1947
  version: string;
1794
1948
  };
1949
+ export type CatalogRecipe = {
1950
+ /**
1951
+ * Grouping label used by the catalog type=recipes category filter. Two values are load-bearing rather than cosmetic: 'Facility Only' and 'Ship Passive' each make the recipe impossible to hand-craft. Prefer hand_craftable, which folds both of those strings together, over comparing this field yourself.
1952
+ */
1953
+ category: string;
1954
+ /**
1955
+ * Base ticks for one production run before venue and skill modifiers. Fractional values are allowed. At the Station Workshop this is divided by a Crafting/Refining skill factor running from 1.0 at level 0 to 5.0 at level 100; a facility applies its own throughput instead and ignores skill.
1956
+ */
1957
+ crafting_time: number;
1958
+ /**
1959
+ * Prose summary of what the recipe does. Guidance for the reader only — no mechanic reads it, and it may be empty.
1960
+ */
1961
+ description: string;
1962
+ /**
1963
+ * True when the recipe runs only inside a production facility and can never be hand-crafted at the Station Workshop. It is one of the two inputs to hand_craftable; category is the other. Do not test it alone — a 'Facility Only' or 'Ship Passive' category recipe is equally un-hand-craftable with this field absent.
1964
+ */
1965
+ facility_only?: boolean;
1966
+ /**
1967
+ * Units of fuel added straight to the processing ship's tank (not to cargo) per run, when this recipe runs as a Ship Passive recipe aboard a fuel-synthesis module. Absent or zero on every recipe that delivers cargo instead.
1968
+ */
1969
+ fuel_output?: number;
1970
+ /**
1971
+ * Whether a docked pilot can run this recipe by hand at their Station Workshop, with no facility of any kind. Derived exactly as: facility_only is false AND category is not 'Facility Only' AND category is not 'Ship Passive'. Always present. False means the recipe needs a venue — a 'Ship Passive' recipe runs itself aboard a ship built for it and can never be queued at all, while any other false value must be queued at one of produced_by_facility_ids. True is a venue answer only: inputs, credits and workshop queue space are still checked when you actually craft.
1972
+ */
1973
+ hand_craftable: boolean;
1974
+ /**
1975
+ * True when the recipe is withheld from the catalog and cannot be crafted. Catalog surfaces omit hidden recipes entirely, so this is absent (false) on every recipe you can actually see.
1976
+ */
1977
+ hidden?: boolean;
1978
+ /**
1979
+ * Stable recipe identifier. Pass it as recipe_id to craft or to facility action=job_add, and it is what catalog type=recipes id={id} looks up.
1980
+ */
1981
+ id: string;
1982
+ /**
1983
+ * Materials consumed per production run. Empty on a package operation, whose real manifest is chosen at craft time, and on a labour-only recipe that consumes nothing at all.
1984
+ */
1985
+ inputs: Array<RecipeInput>;
1986
+ /**
1987
+ * Human-readable recipe name, shown in catalog listings and craft messages. Display only; never pass it as recipe_id.
1988
+ */
1989
+ name: string;
1990
+ /**
1991
+ * True when the process is irreversible and a recycling facility cannot run it backwards. Absent (false) means a recycler can reverse it to recover the inputs.
1992
+ */
1993
+ no_recycle?: boolean;
1994
+ /**
1995
+ * Items produced per production run. The first entry's quantity is the run size: a craft count is rounded up to whole runs against it, so asking for 3 of a recipe that yields 2 queues 2 runs and produces 4.
1996
+ */
1997
+ outputs: Array<RecipeOutput>;
1998
+ /**
1999
+ * Set to pack or unpack on the two dynamic package recipes, whose inputs and outputs are the player-selected manifest rather than the static lists here. Absent on every ordinary recipe.
2000
+ */
2001
+ package_operation?: string;
2002
+ /**
2003
+ * Ids of the facility definitions that can run this recipe forward, each matching an entry in this dump's facilities list. Sorted by facility level then name. Always present, never omitted: an empty list means no facility definition runs it, which for a hand_craftable recipe is normal (the Station Workshop is then the only venue) and for a recipe with hand_craftable false means it has no player-reachable venue at all. Owning or renting one of these facilities is what craft auto-routes to.
2004
+ */
2005
+ produced_by_facility_ids: Array<string>;
2006
+ };
1795
2007
  export type CatalogResponse = {
1796
2008
  analysis?: RecipeAnalysis;
1797
2009
  estimated_material_cost?: number;
@@ -1874,6 +2086,10 @@ export type ChatHistoryMessage = {
1874
2086
  system_id?: string;
1875
2087
  target_id?: string;
1876
2088
  target_name?: string;
2089
+ /**
2090
+ * Structured weekly tax statement when this message is a tax assessment. Omitted for other messages and older notices.
2091
+ */
2092
+ tax_statement?: TaxStatement;
1877
2093
  timestamp_utc: string;
1878
2094
  };
1879
2095
  export type ChatResponse = {
@@ -2596,6 +2812,9 @@ export type DismantleOutpostResponse = {
2596
2812
  name: string;
2597
2813
  };
2598
2814
  export type DistressSignalResponse = {
2815
+ /**
2816
+ * Always "distress_signal". Echoes the command that produced this response.
2817
+ */
2599
2818
  action: string;
2600
2819
  /**
2601
2820
  * True when the engine docked you automatically before running this command, because the command requires being docked. Omitted when no automatic dock happened.
@@ -2605,13 +2824,41 @@ export type DistressSignalResponse = {
2605
2824
  * True when the engine undocked you automatically before running this command, because the command requires being undocked. Omitted when no automatic undock happened.
2606
2825
  */
2607
2826
  auto_undocked?: boolean;
2827
+ /**
2828
+ * The kind of emergency broadcast: "fuel" (stranded without fuel), "repair" (hull critically damaged) or "combat" (under attack). Echoes the requested distress_type, or "fuel" when the request omitted it.
2829
+ */
2608
2830
  distress_type: string;
2831
+ /**
2832
+ * Seconds until the posted rescue mission expires, measured from when the call was sent. 10800 (3 hours) for a player call. An unclaimed mission is removed at expiry, and is also removed early if you travel away under your own power.
2833
+ */
2609
2834
  expires_seconds: number;
2835
+ /**
2836
+ * The broadcast text sent to the emergency chat channel, for example "MAYDAY: Phoenix is stranded at Sol Asteroid Belt in Sol with 0/120 fuel! Any pilots nearby, please help!". Wording depends on distress_type.
2837
+ */
2610
2838
  message: string;
2611
- missions_sent: number;
2839
+ /**
2840
+ * ID of the claimable rescue mission this call posted, for example "a3f9c21e8b04". Nobody is assigned it: any pilot who heard the broadcast can take it by calling accept_mission with this ID, docked or not, and the first claim wins. Empty when responders_reached is 0, because no mission is posted when nobody is in range to hear it.
2841
+ */
2842
+ mission_id: string;
2843
+ /**
2844
+ * ID of the point of interest the call was sent from, for example "sol_asteroid_belt". Responders must reach this POI, not merely the system.
2845
+ */
2612
2846
  poi: string;
2847
+ /**
2848
+ * Display name of the POI in "poi", for example "Sol Asteroid Belt". Falls back to the POI ID when the POI is unknown to the server.
2849
+ */
2613
2850
  poi_name: string;
2851
+ /**
2852
+ * Number of online pilots within 5 jumps who received the broadcast. This is how many heard you, not how many are coming: the mission is an offer and nobody is assigned to it. 0 means nobody was in range, and then mission_id is empty because no mission was posted.
2853
+ */
2854
+ responders_reached: number;
2855
+ /**
2856
+ * ID of the system the call was sent from, for example "sol". This is where you were when the call was queued, which is the wreck site rather than your respawn hub if you died in the same tick.
2857
+ */
2614
2858
  system: string;
2859
+ /**
2860
+ * Display name of the system in "system", for example "Sol". Falls back to the system ID when the system is unknown to the server.
2861
+ */
2615
2862
  system_name: string;
2616
2863
  };
2617
2864
  export type DockResponse = {
@@ -2735,6 +2982,9 @@ export type EmpireNpcInfo = {
2735
2982
  npc_id: string;
2736
2983
  role: string;
2737
2984
  ship_class?: string;
2985
+ /**
2986
+ * Display name of the ship this NPC is flying: its custom name when one is set, otherwise the ship class display name (an unnamed enforcer reads as Enforcer). Presence of this field does not mean the hull is named. Omitted only when the NPC has no resolvable ship.
2987
+ */
2738
2988
  ship_name?: string;
2739
2989
  };
2740
2990
  export type EmpirePolicySnapshot = {
@@ -2812,6 +3062,9 @@ export type EnrichedWreck = {
2812
3062
  poi_id: string;
2813
3063
  salvage_value: number;
2814
3064
  ship_class: string;
3065
+ /**
3066
+ * Custom name the pilot gave this hull, and only that. Unlike ship_name everywhere else in the API it does not fall back to the ship class display name, because the value is a persisted column written when the wreck was created. Omitted when the hull was never named and on wrecks that were never a named ship (jettison containers, creature carcasses, ambient derelicts). Read ship_class for the hull type.
3067
+ */
2815
3068
  ship_name?: string;
2816
3069
  system_id: string;
2817
3070
  towed_by_player_id?: string;
@@ -3126,24 +3379,22 @@ export type FacilityFactionListResponse = {
3126
3379
  base_id: string;
3127
3380
  faction_facilities: Array<FacilityFactionEntry>;
3128
3381
  faction_id: string;
3382
+ /**
3383
+ * Current recurring rent and existing arrears for faction_facilities at this station. Omitted when your faction owns none here; present with zero recurring rent when all of them have paused billing.
3384
+ */
3385
+ faction_rent?: FacilityRentSummary;
3129
3386
  faction_storage?: FacilityFactionStorage;
3130
3387
  hint: string;
3131
3388
  };
3132
3389
  export type FacilityFactionOwnedResponse = {
3133
3390
  action: 'faction_owned';
3134
- /**
3135
- * Credits owed across all facilities: sum rent_per_cycle multiplied by missed_rent_cycles including paused facilities. Pausing billing does not erase existing arrears. Omitted means zero.
3136
- */
3137
- arrears_owed?: number;
3138
3391
  facilities: Array<FactionOwnedFacilityEntry>;
3139
3392
  faction_id: string;
3140
- grace_cycles?: number;
3141
- hint?: string;
3142
- note?: string;
3143
3393
  /**
3144
- * Current faction rent in credits per facility cycle (100 ticks): sum rent_per_cycle for facilities where damaged and under_construction and dismantling are all false. Missing pause flags mean false. Zero means no current recurring rent; excludes existing arrears. Legacy inactive facilities remain billable.
3394
+ * Current recurring rent and existing arrears for every faction facility across all stations.
3145
3395
  */
3146
- total_rent_per_cycle: number;
3396
+ faction_rent: FacilityRentSummary;
3397
+ hint?: string;
3147
3398
  };
3148
3399
  export type FacilityFactionStorage = {
3149
3400
  credits: number;
@@ -3313,6 +3564,9 @@ export type FacilityRentSummary = {
3313
3564
  * Number of owned facilities in this summary including facilities whose billing is paused.
3314
3565
  */
3315
3566
  facilities: number;
3567
+ /**
3568
+ * Consecutive unpayable rent cycles allowed before the station repossesses the facility. Arrears still accrue during the grace window. Omitted means the station sets no grace window.
3569
+ */
3316
3570
  grace_cycles?: number;
3317
3571
  note?: string;
3318
3572
  /**
@@ -3831,6 +4085,10 @@ export type FactionMember = {
3831
4085
  export type FactionMissionEntry = {
3832
4086
  active_instances: number;
3833
4087
  difficulty: number;
4088
+ /**
4089
+ * Objectives from the posted mission template in template order using the get_missions shape. Always present; an empty array means no objectives. These are requirements rather than per-player progress. Bounty objectives include the stored target_player_id even if the player cannot be resolved; target_player is the username and is omitted when the player cannot be resolved.
4090
+ */
4091
+ objectives: Array<ObjectiveInfo>;
3834
4092
  posted_by?: string;
3835
4093
  reward_credits: number;
3836
4094
  template_id: string;
@@ -4146,6 +4404,9 @@ export type FactionTaxEstimateResponse = {
4146
4404
  last_assessed_at?: number;
4147
4405
  loss_carryforward_applied?: number;
4148
4406
  net_taxable_profit: number;
4407
+ /**
4408
+ * Approximate seconds until the next weekly tick boundary: remaining ticks times configured tick duration rounded down to seconds. Paused ticks and later tick-rate changes alter the actual time.
4409
+ */
4149
4410
  next_assessment_approx_seconds: number;
4150
4411
  note?: string;
4151
4412
  tax_collection_active: boolean;
@@ -4548,6 +4809,10 @@ export type GetBaseResponse = {
4548
4809
  power?: StationPowerStatus;
4549
4810
  repairs?: StationRepairResponse;
4550
4811
  services: Array<string>;
4812
+ /**
4813
+ * Explains an input or internal production-stage blockage at this station's empire-backed trade-authenticator mint. Omitted when the mint is absent, disabled, producing, ready, or normally capped.
4814
+ */
4815
+ sovereign_mint?: SovereignMintStatus;
4551
4816
  };
4552
4817
  export type GetBattleLogResponse = {
4553
4818
  battle_id: string;
@@ -4847,6 +5112,13 @@ export type HuntResponse = {
4847
5112
  message: string;
4848
5113
  pending: boolean;
4849
5114
  };
5115
+ export type IncomeTaxBracketBreakdown = {
5116
+ income_in_bracket: number;
5117
+ lower_bound: number;
5118
+ rate_bps: number;
5119
+ tax_from_bracket: number;
5120
+ upper_bound?: number;
5121
+ };
4850
5122
  export type InherentCapability = {
4851
5123
  flag?: string;
4852
5124
  type: string;
@@ -4979,6 +5251,10 @@ export type IntelPoi = {
4979
5251
  base_id?: string;
4980
5252
  base_name?: string;
4981
5253
  class?: string;
5254
+ /**
5255
+ * True when this is a hidden deep core POI holding deposits. Access there needs a deep_core_access extractor that a pilot cannot refit below so the too-sparse cutoff never applies and these deposits always work down to zero. It is the one input to the mining lock formula that you cannot derive from a deposit's own numbers. Omitted (false) for every ordinary POI and for a hidden POI with no resources such as a wormhole mouth.
5256
+ */
5257
+ deep_core?: boolean;
4982
5258
  description?: string;
4983
5259
  id: string;
4984
5260
  name: string;
@@ -5005,6 +5281,10 @@ export type Item = {
5005
5281
  hazardous?: boolean;
5006
5282
  hidden?: boolean;
5007
5283
  id: string;
5284
+ /**
5285
+ * Family of deposits that a specialized extractor targets. Present only on a mined item that belongs to one — currently the value crystal (energy/fury/trade/phase crystal) which the crystal_bonus module special pays its yield bonus out on. Omitted means no specialized-extractor bonus applies to this item.
5286
+ */
5287
+ mining_group?: string;
5008
5288
  name: string;
5009
5289
  quest_item?: boolean;
5010
5290
  rarity?: string;
@@ -5343,12 +5623,12 @@ export type LoungeCheckInResponse = {
5343
5623
  };
5344
5624
  export type McpNotification = {
5345
5625
  /**
5346
- * Frame payload. The shape is selected by msg_type: read the Notification_<msg_type> schema under components.schemas. The notifications array on every v2 response carries the same payloads as an explicit anyOf.
5626
+ * Frame payload selected by msg_type: see Notification_<msg_type>. The same NotificationPayload union is used by polling and inline delivery; null means no payload. This envelope carries no request_id, so an action_result here cannot be matched to a request by that token. Tell a delayed command completion from an unsolicited event by data.command; Notification_action_result explains how.
5347
5627
  */
5348
- data: unknown;
5628
+ data: NotificationPayload;
5349
5629
  id: string;
5350
5630
  /**
5351
- * Specific frame subtype. Switch on this to pick the matching Notification_<msg_type> payload schema. Routing to the coarse type field: chat_message -> chat. player_died / player_kill / scan_detected / pilotless_ship / drone_update / drone_destroyed / battle_started / battle_update / battle_joined / battle_left / battle_ended / battle_alert / ship_captured / prize_update -> combat. trade_offer_received / trade_complete / trade_declined / trade_cancelled -> trade. market_update -> market. crafting_update -> crafting. observation_update -> observation. personnel_update -> system. Frames not named here also route to system - that includes battle_damage / drone_scan / drone_survey / drone_adrift / action_result / action_error / server_restart_warning. A types=combat filter does not carry them.
5631
+ * Specific frame subtype. Switch on this to pick the matching Notification_<msg_type> payload schema. Routing to the coarse type field: chat_message -> chat. player_died / player_kill / scan_detected / pilotless_ship / drone_update / drone_destroyed / battle_started / battle_update / battle_joined / battle_left / battle_ended / battle_alert / ship_captured / prize_update -> combat. trade_offer_received / trade_complete / trade_declined / trade_cancelled -> trade. market_update -> market. crafting_update -> crafting. observation_update -> observation. personnel_update -> system. Frames not named here also route to system - that includes battle_damage / drone_scan / drone_survey / drone_adrift / action_result / action_error / error / server_restart_warning. A types=combat filter does not carry them.
5352
5632
  */
5353
5633
  msg_type: string;
5354
5634
  timestamp: string;
@@ -5461,8 +5741,17 @@ export type MineFilteredResponse = {
5461
5741
  * True when the engine undocked you automatically before running this command, because the command requires being undocked. Omitted when no automatic undock happened.
5462
5742
  */
5463
5743
  auto_undocked?: boolean;
5744
+ /**
5745
+ * Always true on this shape. The action consumed its tick and mined nothing, because a fitted extraction filter rejects every deposit this ship can work at this POI. A filter that rejects only some of the deposits re-targets the cycle instead and returns the yield shape, so this shape never means a partial loss.
5746
+ */
5464
5747
  filtered: boolean;
5748
+ /**
5749
+ * Always the literal value filtered. It marks this member of the mine response union as the no-yield shape, so a client can tell it apart from the yield shape without inspecting any other field.
5750
+ */
5465
5751
  kind: 'filtered';
5752
+ /**
5753
+ * Human-readable explanation of the empty cycle. It names the fitted-filter cause and the two ways out: unfit the filter, or move to a field carrying an ore the filter accepts.
5754
+ */
5466
5755
  message: string;
5467
5756
  };
5468
5757
  export type MineResponse = ({
@@ -5470,6 +5759,24 @@ export type MineResponse = ({
5470
5759
  } & MiningYieldPayload) | ({
5471
5760
  kind: 'filtered';
5472
5761
  } & MineFilteredResponse);
5762
+ export type MiningConstants = {
5763
+ /**
5764
+ * Fraction of capacity below which a deposit counts as depleted and the overkill cutoff can apply. A deposit at or above this fraction of max_remaining is always workable however thin, so naturally tiny veins stay mineable by the gear built for them.
5765
+ */
5766
+ depletion_floor: number;
5767
+ /**
5768
+ * How many times a deposit's supported power your array may apply before it loses its lock entirely instead of tapering. Only bites on a deposit already below depletion_floor, and only for an array whose power times its precision factor exceeds precision_k.
5769
+ */
5770
+ overkill_ratio: number;
5771
+ /**
5772
+ * Units of remaining stock required per point of applied beam power for full-rate extraction, before your array's precision factor is applied. A deposit supports remaining divided by this (times your precision factor) worth of power; power above that is capped down to it rather than wasted.
5773
+ */
5774
+ precision_k: number;
5775
+ /**
5776
+ * Weight multiplier per Mining skill level that biases which deposit a mining cycle selects toward rarer ore. A deposit's selection weight is its richness times (1 + this * your Mining level * its rarity rank) where rarity rank is 0 for common 1 uncommon 2 rare 3 exotic and 4 legendary. At Mining level 0 the term vanishes and selection is weighted by richness alone. Selection only; it changes which deposit a cycle picks at a POI holding several and never changes yield.
5777
+ */
5778
+ rare_ore_rarity_weight_per_level: number;
5779
+ };
5473
5780
  export type MiningYieldPayload = {
5474
5781
  auto_docked?: boolean;
5475
5782
  auto_undocked?: boolean;
@@ -5486,6 +5793,18 @@ export type MiningYieldPayload = {
5486
5793
  [key: string]: number;
5487
5794
  };
5488
5795
  };
5796
+ export type MissionAutoCompleteRewards = {
5797
+ /**
5798
+ * Nominal mission credit reward. Zero means no credit reward. The wallet cap can reduce the credits actually added; this field is not the resulting balance.
5799
+ */
5800
+ credits: number;
5801
+ /**
5802
+ * Skill XP actually awarded keyed by skill ID. Always present; an empty object means no XP was awarded. Missing skill keys mean zero XP.
5803
+ */
5804
+ skill_xp: {
5805
+ [key: string]: number;
5806
+ };
5807
+ };
5489
5808
  export type MissionDialogInfo = {
5490
5809
  accept?: string;
5491
5810
  complete?: string;
@@ -5629,6 +5948,9 @@ export type Module = {
5629
5948
  passive_repair?: number;
5630
5949
  power_bonus?: number;
5631
5950
  power_usage: number;
5951
+ /**
5952
+ * Vein-density multiplier on how dense a deposit this beam needs. Above 1 is coarser and needs denser deposits; below 1 is finer and works thinner ones; omitted or 0 means the standard 1.0. Multiply it into the catalog mining.precision_k when computing a deposit's supported power or your lock threshold. A rig with several extractors uses the power-weighted average across them.
5953
+ */
5632
5954
  precision_factor?: number;
5633
5955
  quest_item?: boolean;
5634
5956
  reach?: number;
@@ -5684,28 +6006,58 @@ export type NameShipResponse = {
5684
6006
  * A player visible at the current POI.
5685
6007
  */
5686
6008
  export type NearbyPlayer = {
6009
+ /**
6010
+ * Self-assigned clan tag of up to 4 characters. It is cosmetic and unrelated to faction membership - faction_id and faction_tag carry the real affiliation. Omitted when the player has not set one.
6011
+ */
5687
6012
  clan_tag?: string;
5688
6013
  /**
5689
6014
  * True when the player is docked at a base. Docked players are listed but cannot be attacked, scanned, or traded with until they undock.
5690
6015
  */
5691
6016
  docked?: boolean;
6017
+ /**
6018
+ * Id of the faction the player belongs to. Omitted when the player is unaffiliated.
6019
+ */
5692
6020
  faction_id?: string;
6021
+ /**
6022
+ * Short display tag of that faction. Present whenever faction_id is and the faction record still resolves.
6023
+ */
5693
6024
  faction_tag?: string;
5694
- in_combat?: boolean;
6025
+ /**
6026
+ * True while the player is in an active battle. Always emitted: false means not in combat.
6027
+ */
6028
+ in_combat: boolean;
5695
6029
  /**
5696
6030
  * True when the player has no active connection and no recent activity. Offline players are still listed when the POI total is small; otherwise summarised in the response's offline_collapsed count.
5697
6031
  */
5698
6032
  offline?: boolean;
5699
- player_id?: string;
6033
+ /**
6034
+ * Unique id of the player. It is the target id for attack and scan. Always present on a listed player.
6035
+ */
6036
+ player_id: string;
6037
+ /**
6038
+ * Cosmetic profile colour the player set with set_colors, as a 7-character #RRGGBB hex string (new pilots start at #FFFFFF). Decorative only - it drives no game mechanic. Omitted when the player has cleared their colours.
6039
+ */
5700
6040
  primary_color?: string;
6041
+ /**
6042
+ * Cosmetic secondary profile colour in the same 7-character #RRGGBB form as primary_color (new pilots start at #000000). Decorative only. Omitted when the player has cleared their colours.
6043
+ */
5701
6044
  secondary_color?: string;
6045
+ /**
6046
+ * Class id of the hull the player is currently flying (for example enforcer). Omitted only when the player has no resolvable current ship.
6047
+ */
5702
6048
  ship_class?: string;
5703
6049
  /**
5704
- * Custom ship name if set
6050
+ * Display name of the ship this player is flying: their custom name when they have set one, otherwise the ship class display name (an unnamed enforcer reads as Enforcer). Presence of this field does not mean the hull is named. Omitted only when the player has no resolvable current ship.
5705
6051
  */
5706
6052
  ship_name?: string;
6053
+ /**
6054
+ * Free-text status line the player set with set_status. Omitted when they have not set one.
6055
+ */
5707
6056
  status_message?: string;
5708
- username?: string;
6057
+ /**
6058
+ * Pilot name the player registered under. Always present on a listed player.
6059
+ */
6060
+ username: string;
5709
6061
  };
5710
6062
  export type NoteInfo = {
5711
6063
  content_length: number;
@@ -5721,6 +6073,10 @@ export type NotificationChannelInfo = {
5721
6073
  message_types: Array<string>;
5722
6074
  muted: boolean;
5723
6075
  };
6076
+ /**
6077
+ * Frame payload shared by polling and inline notifications. Select Notification_<msg_type> using the envelope msg_type; payload shapes can overlap so this is an anyOf union. Null means the frame supplied no payload.
6078
+ */
6079
+ export type NotificationPayload = NotificationAchievementUnlocked | NotificationActionError | NotificationActionResult | NotificationArenaChallenge | NotificationArenaObjective | NotificationBaseDestroyed | NotificationBaseRaidUpdate | NotificationBattleAlert | NotificationBattleDamage | NotificationBattleEnded | NotificationBattleJoined | NotificationBattleLeft | NotificationBattleStarted | NotificationBattleUpdate | NotificationChatMessage | NotificationCloak | NotificationCompleteMission | NotificationCraftingUpdate | NotificationDroneAdrift | NotificationDroneDestroyed | NotificationDroneScan | NotificationDroneSurvey | NotificationDroneUpdate | NotificationError | NotificationFacilityReclaimed | NotificationFacilityRentWarning | NotificationFactionAllianceBroken | NotificationFactionAllianceFormed | NotificationFactionAllianceProposal | NotificationFactionPeaceAccepted | NotificationFactionPeaceProposal | NotificationFactionWarDeclared | NotificationFleet | NotificationMarketUpdate | NotificationMiningYield | NotificationObservationUpdate | NotificationOk | NotificationPersonnelUpdate | NotificationPilotlessShip | NotificationPirateDestroyed | NotificationPirateRadio | NotificationPlayerDied | NotificationPlayerKill | NotificationPrizeUpdate | NotificationRanchPoached | NotificationReconnected | NotificationRefueledBy | NotificationRepairedBy | NotificationScanDetected | NotificationServerRestartWarning | NotificationShipCaptured | NotificationShipCommissionComplete | NotificationSkillLevelUp | NotificationStationRepaired | NotificationTradeCancelled | NotificationTradeComplete | NotificationTradeDeclined | NotificationTradeOfferReceived | null;
5724
6080
  export type NotificationSettingsResponse = {
5725
6081
  action: string;
5726
6082
  channels: Array<NotificationChannelInfo>;
@@ -5775,7 +6131,7 @@ export type NotificationActionError = {
5775
6131
  tick: number;
5776
6132
  };
5777
6133
  /**
5778
- * Result of a queued action that completed on a later tick. It is delivered to the caller waiting on the originating request_id when one is still attached. Otherwise it is queued and collected through get_notifications, which is the normal path once a request has already returned.
6134
+ * A state update from the server. Two producers send it. A queued action that completed on a later tick is delivered to the caller waiting on the originating request_id when one is still attached; otherwise it is queued and collected through get_notifications, which is the normal path once a request has already returned. The server also pushes this frame with NO request_id when it changes your state without you having commanded it — you died, your ship was captured, a module warped you home, the fleet you were riding with arrived, or the station you were docked at moved. Never assume a request_id is present: an absent one means nothing of yours is waiting on this frame, not that the frame is malformed. A notification collected through get_notifications never has one, because that envelope carries no request_id. On that path, tell a delayed completion from an unsolicited push by command. A registered command name (mine, dock, buy) is a completion. An event name is unsolicited, and so are travel and jump on a fleet follower (see command). A death or a capture arrives as two notifications. The first is the story frame, player_died or ship_captured, which names the killer or captor and the cause. The second is this frame with command set to that event and the state delta. The second is not a duplicate and not the completion of a command you sent. Apply the delta. Read the story frame for the cause. The unsolicited form is sent only while your live WebSocket speaks v2, so a client that only polls receives the story frame alone.
5779
6135
  */
5780
6136
  export type NotificationActionResult = {
5781
6137
  /**
@@ -5787,11 +6143,11 @@ export type NotificationActionResult = {
5787
6143
  */
5788
6144
  auto_undocked?: boolean;
5789
6145
  /**
5790
- * Name of the command that ran.
6146
+ * Name of the command that ran. On an unsolicited push (no request_id) no command ran, and this instead names the event that changed your state: player_died, ship_captured, emergency_warp_stabilizer, passenger_stranded, fleet_kicked, fleet_disbanded, or mobile_capital_transit. Fleet followers also receive travel or jump at arrival without having submitted those commands. fleet_dock is instead an ok notification with action=fleet_dock (see Notification_ok). Not restricted to registered command names, so switch on it with a default branch rather than an exhaustive one.
5791
6147
  */
5792
6148
  command: string;
5793
6149
  /**
5794
- * Payload of the completed command. On v1 this is the command's own response object — see that command's response schema. On v2 it is the state delta the command registered, keyed by state section. Untyped because both shapes are possible; it is null when the command returned no body.
6150
+ * Payload of the completed command. On v1 this is the command's own response object — see that command's response schema. On v2 it is a state delta keyed by state section: the sections the command registered, or every section on an unsolicited push, since an event that moves you without your asking changes more than any one command does. A section that is absent is unchanged. Untyped because all these shapes are possible; it is null when the command returned no body.
5795
6151
  */
5796
6152
  result: unknown;
5797
6153
  /**
@@ -5841,6 +6197,36 @@ export type NotificationArenaChallenge = {
5841
6197
  */
5842
6198
  poi_id: string;
5843
6199
  };
6200
+ export type NotificationArenaObjective = {
6201
+ /**
6202
+ * ID of the arena battle.
6203
+ */
6204
+ battle_id: string;
6205
+ /**
6206
+ * ID of the NPC challenge being fought, as listed by arena action=challenges.
6207
+ */
6208
+ challenge_id: string;
6209
+ /**
6210
+ * The enemy ships the wave brought. Present only when event is wave_arrived.
6211
+ */
6212
+ enemies?: Array<ArenaObjectiveEnemy>;
6213
+ /**
6214
+ * What happened: wave_arrived (reinforcements joined the enemy side), objective_won (the objective handed your side the match), objective_lost (the objective handed the enemy side the match). The match itself ends on the same tick as objective_won or objective_lost, followed by battle_ended.
6215
+ */
6216
+ event: 'wave_arrived' | 'objective_won' | 'objective_lost';
6217
+ /**
6218
+ * Human-readable summary of the event.
6219
+ */
6220
+ message: string;
6221
+ /**
6222
+ * Which objective decided the match: survive_ticks (your side lasted the required ticks), time_limit (an enemy was still standing at the deadline), enemy_escaped (an enemy cleared the ring). Present only when event is objective_won or objective_lost.
6223
+ */
6224
+ objective?: 'survive_ticks' | 'time_limit' | 'enemy_escaped';
6225
+ /**
6226
+ * Name of the wave that arrived. Present only when event is wave_arrived.
6227
+ */
6228
+ wave_name?: string;
6229
+ };
5844
6230
  export type NotificationBaseDestroyed = {
5845
6231
  attacker_id: string;
5846
6232
  attacker_name: string;
@@ -5939,6 +6325,10 @@ export type NotificationChatMessage = {
5939
6325
  */
5940
6326
  channel?: string;
5941
6327
  content?: string;
6328
+ /**
6329
+ * Kind of emergency: fuel, repair or combat. Set on the emergency channel only.
6330
+ */
6331
+ distress_type?: string;
5942
6332
  /**
5943
6333
  * True when the server originated the message through the admin empire-leadership pipeline or an empire-NPC code path. Player clients cannot set this; recipients can rely on it to distinguish authentic empire communications from spoofed display names.
5944
6334
  */
@@ -5948,6 +6338,10 @@ export type NotificationChatMessage = {
5948
6338
  */
5949
6339
  faction_id?: string;
5950
6340
  id?: string;
6341
+ /**
6342
+ * ID of the rescue mission this broadcast posted. Set on the emergency channel only. Nobody is assigned the mission: pass this id to accept_mission to claim it, from anywhere and docked or not, and the first claim wins.
6343
+ */
6344
+ mission_id?: string;
5951
6345
  /**
5952
6346
  * Set on local channel.
5953
6347
  */
@@ -5957,6 +6351,10 @@ export type NotificationChatMessage = {
5957
6351
  */
5958
6352
  sender?: string;
5959
6353
  sender_id?: string;
6354
+ /**
6355
+ * Display name of the system the call came from. Set on the emergency channel only.
6356
+ */
6357
+ system?: string;
5960
6358
  /**
5961
6359
  * Set on system / local channels.
5962
6360
  */
@@ -5968,6 +6366,42 @@ export type NotificationChatMessage = {
5968
6366
  target_name?: string;
5969
6367
  timestamp?: string;
5970
6368
  };
6369
+ /**
6370
+ * Automatic cloak state change: fuel exhaustion, a missing cloaking device, or emergency cloak expiry disables the cloak; an emergency cloak can enable it after shield failure. Carried as msg_type=cloak without a client request.
6371
+ */
6372
+ export type NotificationCloak = {
6373
+ auto_docked?: boolean;
6374
+ auto_undocked?: boolean;
6375
+ /**
6376
+ * Current cloak strength; zero when disabled.
6377
+ */
6378
+ cloak_strength: number;
6379
+ /**
6380
+ * Whether the player is cloaked after this event.
6381
+ */
6382
+ enabled: boolean;
6383
+ /**
6384
+ * Human-readable explanation of the automatic cloak change.
6385
+ */
6386
+ message: string;
6387
+ };
6388
+ /**
6389
+ * Distress mission auto-completion pushed as msg_type=complete_mission without a client command. This is not the response shape of a manually submitted complete_mission action.
6390
+ */
6391
+ export type NotificationCompleteMission = {
6392
+ /**
6393
+ * ID of the completed mission instance.
6394
+ */
6395
+ mission_id: string;
6396
+ /**
6397
+ * Display title of the completed mission.
6398
+ */
6399
+ mission_title: string;
6400
+ /**
6401
+ * Nominal credit reward and skill XP actually awarded for completion.
6402
+ */
6403
+ rewards: MissionAutoCompleteRewards;
6404
+ };
5971
6405
  export type NotificationCraftingUpdate = {
5972
6406
  jobs: Array<CraftingJobUpdate>;
5973
6407
  tick: number;
@@ -6045,6 +6479,11 @@ export type NotificationDroneUpdate = {
6045
6479
  target_id: string;
6046
6480
  tick: number;
6047
6481
  };
6482
+ export type NotificationError = {
6483
+ code: string;
6484
+ message: string;
6485
+ pending_command?: string;
6486
+ };
6048
6487
  /**
6049
6488
  * Pushed to a facility owner (or all faction members) when the station repossesses facilities for unpaid rent.
6050
6489
  */
@@ -6132,6 +6571,27 @@ export type NotificationFactionWarDeclared = {
6132
6571
  message: string;
6133
6572
  reason?: string;
6134
6573
  };
6574
+ /**
6575
+ * Fleet lifecycle notification, including death, succession, and arena disbanding. action is fleet_leader_promoted, fleet_disbanded, or fleet_member_died. Delivered without an originating request_id to affected fleet members.
6576
+ */
6577
+ export type NotificationFleet = {
6578
+ /**
6579
+ * Fleet event: fleet_leader_promoted, fleet_disbanded, or fleet_member_died. Tolerate future event names.
6580
+ */
6581
+ action: string;
6582
+ /**
6583
+ * Human-readable event explanation.
6584
+ */
6585
+ message: string;
6586
+ /**
6587
+ * Promoted leader username, falling back to player ID if unresolved; only present for fleet_leader_promoted.
6588
+ */
6589
+ new_leader?: string;
6590
+ /**
6591
+ * Destroyed member username; only present for fleet_member_died.
6592
+ */
6593
+ player_name?: string;
6594
+ };
6135
6595
  export type NotificationMarketUpdate = {
6136
6596
  base_id: string;
6137
6597
  base_name?: string;
@@ -6155,7 +6615,15 @@ export type NotificationMiningYield = {
6155
6615
  };
6156
6616
  };
6157
6617
  export type NotificationObservationUpdate = {
6158
- active_scan?: boolean;
6618
+ active_scan: boolean;
6619
+ /**
6620
+ * Arena challenge enemies that joined the match at the watched POI or whose visible state (hull, shield, status, flees) changed this tick. A knockout surfaces here as hull reaching 0 — not as a departure. Omitted when none changed. Expect one on most updates while a match runs, because hull and shield move every tick.
6621
+ */
6622
+ arena_npcs_changed?: Array<ArenaNpcInfo>;
6623
+ /**
6624
+ * IDs of arena challenge enemies removed from the watched POI. Enemies are removed only when their match ends, so a knocked-out enemy stays in the feed at hull 0 until then — a missing departure does not mean it is still fighting. Omitted when none departed.
6625
+ */
6626
+ arena_npcs_departed?: Array<string>;
6159
6627
  cloaked_lost?: Array<string>;
6160
6628
  cloaked_resolved?: Array<ScanContact>;
6161
6629
  creatures_changed?: Array<CreatureInfo>;
@@ -6175,6 +6643,39 @@ export type NotificationObservationUpdate = {
6175
6643
  tick: number;
6176
6644
  unknown_signature: boolean;
6177
6645
  };
6646
+ /**
6647
+ * Fleet movement ok notifications identify their event in action. Other ok payloads may omit action. Fleet followers receive fleet_dock (base name and base_id), fleet_undock, fleet_travel (destination POI ID and arrival_tick), or fleet_jump (destination system ID and arrival_tick) without request_id. fleet_dock is not a command or a separate message type; DockResponse describes the leader's dock command, not this push. Other actions and command-specific fields may occur. Inspect action and tolerate unknown actions. Delta-capable WebSocket followers also receive action_result with command travel or jump at arrival.
6648
+ */
6649
+ export type NotificationOk = {
6650
+ /**
6651
+ * Event or completed command name. For coordinated docking this is fleet_dock.
6652
+ */
6653
+ action?: string;
6654
+ /**
6655
+ * Scheduled arrival game tick for fleet_travel or fleet_jump; omitted for fleet_dock and fleet_undock.
6656
+ */
6657
+ arrival_tick?: number;
6658
+ /**
6659
+ * Station display name string for fleet_dock. Other OK responses may carry a base object or null.
6660
+ */
6661
+ base?: {
6662
+ [key: string]: unknown;
6663
+ } | {
6664
+ [key: string]: unknown;
6665
+ } | null;
6666
+ /**
6667
+ * Station Base ID, always present for fleet_dock; distinct from its POI ID. Omitted for fleet_undock, fleet_travel and fleet_jump.
6668
+ */
6669
+ base_id?: string;
6670
+ /**
6671
+ * Destination POI ID for fleet_travel or system ID for fleet_jump; omitted for fleet_dock and fleet_undock.
6672
+ */
6673
+ destination?: string;
6674
+ /**
6675
+ * Human-readable event explanation.
6676
+ */
6677
+ message?: string;
6678
+ };
6178
6679
  export type NotificationPersonnelUpdate = {
6179
6680
  /**
6180
6681
  * What an ally did to your active ship. treatment healed injured crew or marines. transfer moved personnel between ships.
@@ -6352,6 +6853,9 @@ export type NotificationPirateRadio = {
6352
6853
  */
6353
6854
  speaker_id: string;
6354
6855
  };
6856
+ /**
6857
+ * Your ship was destroyed. This is the story frame: the killer, the cause, the wreck, the respawn base and the insurance payout. When your live WebSocket speaks v2, a death yields two notifications: this one and an action_result with command player_died that carries every state section. That action_result is not a duplicate and not the completion of a command you sent. Apply its delta. Read this frame for the cause. A client that only polls get_notifications and has no v2 WebSocket receives this frame alone.
6858
+ */
6355
6859
  export type NotificationPlayerDied = {
6356
6860
  cause?: string;
6357
6861
  clone_cost: number;
@@ -6425,6 +6929,9 @@ export type NotificationPrizeUpdate = {
6425
6929
  prize_id: string;
6426
6930
  ship_class: string;
6427
6931
  ship_id: string;
6932
+ /**
6933
+ * Display name of the captured ship: the custom name its pilot set when there is one, otherwise the ship class display name (an unnamed enforcer reads as Enforcer). Presence of this field does not mean the hull is named. Omitted only when the captured hull no longer resolves in server state.
6934
+ */
6428
6935
  ship_name?: string;
6429
6936
  /**
6430
6937
  * Recovery state of the prize. delivered / destroyed / expired / recaptured are terminal.
@@ -6455,6 +6962,20 @@ export type NotificationReconnected = {
6455
6962
  ticks_remaining: number;
6456
6963
  was_pilotless: boolean;
6457
6964
  };
6965
+ export type NotificationRefueledBy = {
6966
+ fuel: number;
6967
+ fuel_max: number;
6968
+ fuel_now: number;
6969
+ source_player_id: string;
6970
+ source_username: string;
6971
+ };
6972
+ export type NotificationRepairedBy = {
6973
+ hull: number;
6974
+ max_hull: number;
6975
+ repaired: number;
6976
+ source_player_id: string;
6977
+ source_username: string;
6978
+ };
6458
6979
  export type NotificationScanDetected = {
6459
6980
  message: string;
6460
6981
  revealed_info: Array<string>;
@@ -6467,6 +6988,9 @@ export type NotificationServerRestartWarning = {
6467
6988
  seconds_until_restart: number;
6468
6989
  target_version?: string;
6469
6990
  };
6991
+ /**
6992
+ * A boarding capture succeeded. This is the story frame: the captor, the former owner and the ship. It is sent to the captor, the former owner and every participant in the battle. When the former owner's live WebSocket speaks v2, the capture yields two notifications for them: this one and an action_result with command ship_captured that carries every state section. That action_result is not a duplicate and not the completion of a command they sent. Apply its delta. Read this frame for the cause. A client that only polls get_notifications and has no v2 WebSocket receives this frame alone.
6993
+ */
6470
6994
  export type NotificationShipCaptured = {
6471
6995
  battle_id: string;
6472
6996
  boarding_operation_id: string;
@@ -6478,6 +7002,26 @@ export type NotificationShipCaptured = {
6478
7002
  captor_username: string;
6479
7003
  former_owner_id: string;
6480
7004
  former_owner_username: string;
7005
+ /**
7006
+ * Prize created for the captured hull. Omitted on historical persisted records and on arena captures, which create no prize.
7007
+ */
7008
+ prize_id?: string;
7009
+ /**
7010
+ * POI where the prize sits (the battle origin, which can differ from your POI). Omitted when there is no prize, the POI is hidden, or the battle began in transit.
7011
+ */
7012
+ prize_poi_id?: string;
7013
+ /**
7014
+ * Display name of the prize POI. Omitted when unknown or hidden.
7015
+ */
7016
+ prize_poi_name?: string;
7017
+ /**
7018
+ * System where the prize sits. Omitted when there is no prize.
7019
+ */
7020
+ prize_system_id?: string;
7021
+ /**
7022
+ * Display name of the prize system. Omitted when unknown.
7023
+ */
7024
+ prize_system_name?: string;
6481
7025
  ship_class: string;
6482
7026
  ship_id: string;
6483
7027
  tick: number;
@@ -7200,6 +7744,14 @@ export type PlayerStats = {
7200
7744
  * Unix timestamp of the most recent property-tax assessment
7201
7745
  */
7202
7746
  last_property_tax_assessed_at?: number;
7747
+ /**
7748
+ * UTC start of the latest weekly assessment, including an exempt period. Zero time means no tracked weekly boundary; the first assessment remains eligible.
7749
+ */
7750
+ last_weekly_tax_assessed_at?: string;
7751
+ /**
7752
+ * Latest completed personal weekly statement, also returned as latest_statement by get_tax_estimate. Omitted before the first statement. Later debt payments do not change this historical statement.
7753
+ */
7754
+ latest_tax_statement?: TaxStatement;
7203
7755
  marine_deaths?: number;
7204
7756
  marine_injuries?: number;
7205
7757
  marine_injuries_healed?: number;
@@ -7271,6 +7823,10 @@ export type PlayerStats = {
7271
7823
  * Times a Pathfinder course was plotted into open space
7272
7824
  */
7273
7825
  void_drifts?: number;
7826
+ /**
7827
+ * Gameplay or economic activity recorded since the latest weekly boundary. Omitted means false. This flag alone does not determine eligibility: unassessed income or purchases and an untracked first period also prevent inactivity exemption.
7828
+ */
7829
+ weekly_tax_active?: boolean;
7274
7830
  wormholes_traversed?: number;
7275
7831
  wreck_items_looted?: number;
7276
7832
  wrecks_scrapped?: number;
@@ -7501,17 +8057,53 @@ export type RecallDroneResponse = {
7501
8057
  skipped: number;
7502
8058
  };
7503
8059
  export type Recipe = {
8060
+ /**
8061
+ * Grouping label used by the catalog type=recipes category filter. Two values are load-bearing rather than cosmetic: 'Facility Only' and 'Ship Passive' each make the recipe impossible to hand-craft. Prefer hand_craftable, which folds both of those strings together, over comparing this field yourself.
8062
+ */
7504
8063
  category: string;
8064
+ /**
8065
+ * Base ticks for one production run before venue and skill modifiers. Fractional values are allowed. At the Station Workshop this is divided by a Crafting/Refining skill factor running from 1.0 at level 0 to 5.0 at level 100; a facility applies its own throughput instead and ignores skill.
8066
+ */
7505
8067
  crafting_time: number;
8068
+ /**
8069
+ * Prose summary of what the recipe does. Guidance for the reader only — no mechanic reads it, and it may be empty.
8070
+ */
7506
8071
  description: string;
8072
+ /**
8073
+ * True when the recipe runs only inside a production facility and can never be hand-crafted at the Station Workshop. It is one of the two inputs to hand_craftable; category is the other. Do not test it alone — a 'Facility Only' or 'Ship Passive' category recipe is equally un-hand-craftable with this field absent.
8074
+ */
7507
8075
  facility_only?: boolean;
8076
+ /**
8077
+ * Units of fuel added straight to the processing ship's tank (not to cargo) per run, when this recipe runs as a Ship Passive recipe aboard a fuel-synthesis module. Absent or zero on every recipe that delivers cargo instead.
8078
+ */
7508
8079
  fuel_output?: number;
8080
+ /**
8081
+ * True when the recipe is withheld from the catalog and cannot be crafted. Catalog surfaces omit hidden recipes entirely, so this is absent (false) on every recipe you can actually see.
8082
+ */
7509
8083
  hidden?: boolean;
8084
+ /**
8085
+ * Stable recipe identifier. Pass it as recipe_id to craft or to facility action=job_add, and it is what catalog type=recipes id={id} looks up.
8086
+ */
7510
8087
  id: string;
8088
+ /**
8089
+ * Materials consumed per production run. Empty on a package operation, whose real manifest is chosen at craft time, and on a labour-only recipe that consumes nothing at all.
8090
+ */
7511
8091
  inputs: Array<RecipeInput>;
8092
+ /**
8093
+ * Human-readable recipe name, shown in catalog listings and craft messages. Display only; never pass it as recipe_id.
8094
+ */
7512
8095
  name: string;
8096
+ /**
8097
+ * True when the process is irreversible and a recycling facility cannot run it backwards. Absent (false) means a recycler can reverse it to recover the inputs.
8098
+ */
7513
8099
  no_recycle?: boolean;
8100
+ /**
8101
+ * Items produced per production run. The first entry's quantity is the run size: a craft count is rounded up to whole runs against it, so asking for 3 of a recipe that yields 2 queues 2 runs and produces 4.
8102
+ */
7514
8103
  outputs: Array<RecipeOutput>;
8104
+ /**
8105
+ * Set to pack or unpack on the two dynamic package recipes, whose inputs and outputs are the player-selected manifest rather than the static lists here. Absent on every ordinary recipe.
8106
+ */
7515
8107
  package_operation?: string;
7516
8108
  };
7517
8109
  export type RecipeAnalysis = {
@@ -7671,6 +8263,7 @@ export type ReleaseTowResponse = {
7671
8263
  message: string;
7672
8264
  wreck_id: string;
7673
8265
  };
8266
+ export type ReloadCommandResponse = ReloadResponse | BulkReloadResponse;
7674
8267
  export type ReloadResponse = {
7675
8268
  action: string;
7676
8269
  ammo_id: string;
@@ -7702,14 +8295,46 @@ export type RepairResponse = {
7702
8295
  target_player_name?: string;
7703
8296
  };
7704
8297
  export type ResourceInfo = {
8298
+ /**
8299
+ * How far this deposit is drawn down, as a percentage of max_remaining. Below 25 percent a deposit is depleted enough for lock_minimum_stock to take effect. Omitted when max_remaining is.
8300
+ */
7705
8301
  depletion_percent?: number;
8302
+ /**
8303
+ * Stock this deposit must hold for your fitted array to keep a lock on it once the deposit falls below a quarter of capacity. Below both thresholds at once the beam disperses the remaining fragments and extraction fails with deposit_too_sparse. Omitted when your array can never lose a lock here — either its power adjusted for precision is at most 20, or this is a deep core POI, where the hard cutoff never applies.
8304
+ */
8305
+ lock_minimum_stock?: number;
8306
+ /**
8307
+ * Capacity this deposit regenerates back toward, seeded from its starting stock. Omitted for unlimited deposits, which have no capacity and never lock.
8308
+ */
7706
8309
  max_remaining?: number;
8310
+ /**
8311
+ * Display name of the resource. Falls back to the raw item id when the catalog has no entry for it.
8312
+ */
7707
8313
  name: string;
8314
+ /**
8315
+ * Units of stock left. -1 means an unlimited deposit that never depletes and never regenerates; 0 means fully depleted. A finite deposit below capacity regenerates at least 1 unit per minute.
8316
+ */
7708
8317
  remaining: number;
8318
+ /**
8319
+ * Human-readable form of remaining: the string unlimited, the string depleted, or a unit count such as 4000 units.
8320
+ */
7709
8321
  remaining_display: string;
8322
+ /**
8323
+ * Item id of the ore, gas, ice or radioactive material in this deposit — for example iron_ore or fury_crystal. Look it up in the catalog for its rarity and which extractor works it.
8324
+ */
7710
8325
  resource_id: string;
8326
+ /**
8327
+ * Percentage multiplier on extraction yield: yield is applied beam power times richness divided by 100, floored at 1 unit per action. It also weights random deposit selection when a POI holds several, so a richer deposit is picked more often.
8328
+ */
7711
8329
  richness: number;
8330
+ /**
8331
+ * Beam power this deposit accepts at full extraction rate, computed for the extraction hardware you have fitted right now — remaining stock divided by 20 and by your array's precision factor. Applying more than this is not wasted: power above it is capped down to it and extraction continues at the reduced rate. Omitted when the deposit is depleted or unlimited.
8332
+ */
7712
8333
  supported_power?: number;
8334
+ /**
8335
+ * True when your currently fitted array cannot work this deposit at all right now. Fit a lower-power or finer-precision extractor, or mine a richer deposit. Omitted (false) whenever the deposit is workable.
8336
+ */
8337
+ too_sparse?: boolean;
7713
8338
  };
7714
8339
  export type ResourceNode = {
7715
8340
  max_remaining?: number;
@@ -7745,6 +8370,9 @@ export type ScanContact = {
7745
8370
  revealed_info: Array<string>;
7746
8371
  shield?: number;
7747
8372
  ship_class?: string;
8373
+ /**
8374
+ * Display name of the scanned ship: the custom name its pilot set when there is one, otherwise the ship class display name. Presence of this field does not mean the hull is named. Omitted when the scan did not reach the ship_class reveal tier.
8375
+ */
7748
8376
  ship_name?: string;
7749
8377
  target_id: string;
7750
8378
  username?: string;
@@ -7760,6 +8388,9 @@ export type ScanResponse = {
7760
8388
  revealed_info: Array<string>;
7761
8389
  shield?: number;
7762
8390
  ship_class?: string;
8391
+ /**
8392
+ * Display name of the scanned ship: the custom name its pilot set when there is one, otherwise the ship class display name. Presence of this field does not mean the hull is named. Omitted when the scan did not reach the ship_class reveal tier.
8393
+ */
7763
8394
  ship_name?: string;
7764
8395
  signature_detected?: boolean;
7765
8396
  success: boolean;
@@ -7879,6 +8510,7 @@ export type SellWreckResponse = {
7879
8510
  */
7880
8511
  auto_undocked?: boolean;
7881
8512
  message: string;
8513
+ modules_stored?: Array<SoldModuleItem>;
7882
8514
  new_balance: number;
7883
8515
  offer: number;
7884
8516
  salvage_value?: number;
@@ -8614,6 +9246,88 @@ export type SoldModuleItem = {
8614
9246
  module_type: string;
8615
9247
  name: string;
8616
9248
  };
9249
+ export type SovereignMintInputShortage = {
9250
+ /**
9251
+ * Always present. True exactly when this station manager has a public non-commission buy order for this item with remaining quantity greater than zero. False means no such order is available. Availability is a snapshot and does not guarantee enough order depth to cover quantity_missing.
9252
+ */
9253
+ buy_order_available: boolean;
9254
+ /**
9255
+ * Stable item ID of the externally procurable root input. At the Grand Exchange this normally identifies minable Trade Crystals rather than the internally produced Trade Cipher intermediate.
9256
+ */
9257
+ item_id: string;
9258
+ /**
9259
+ * Display name of item_id. Falls back to item_id when the item definition is unavailable.
9260
+ */
9261
+ name?: string;
9262
+ /**
9263
+ * Units currently present in station-manager storage and available to that recipe run.
9264
+ */
9265
+ quantity_in_storage: number;
9266
+ /**
9267
+ * Additional units needed, equal to max(quantity_required minus quantity_in_storage, 0). This entry is present only when the result is greater than zero.
9268
+ */
9269
+ quantity_missing: number;
9270
+ /**
9271
+ * Units required in station-manager storage to queue the next relevant mint-chain recipe run.
9272
+ */
9273
+ quantity_required: number;
9274
+ };
9275
+ export type SovereignMintInternalBlocker = {
9276
+ /**
9277
+ * Installed station facility instance responsible for this stage. Omitted when the required stage is not installed.
9278
+ */
9279
+ facility_id?: string;
9280
+ /**
9281
+ * Display name of facility_id.
9282
+ */
9283
+ facility_name?: string;
9284
+ /**
9285
+ * Stable item ID produced by this required stage.
9286
+ */
9287
+ item_id: string;
9288
+ /**
9289
+ * Display name of item_id.
9290
+ */
9291
+ name?: string;
9292
+ /**
9293
+ * Explains that station repair, construction, or restoration must return this production stage to service. For internal intermediates, the output is not a normal player supply request.
9294
+ */
9295
+ remediation: string;
9296
+ /**
9297
+ * Classification of this blocker.
9298
+ */
9299
+ stage: 'internal_intermediate' | 'sovereign_mint';
9300
+ /**
9301
+ * Why the required station production stage cannot currently run.
9302
+ */
9303
+ status: 'damaged' | 'under_construction' | 'unavailable';
9304
+ };
9305
+ export type SovereignMintStatus = {
9306
+ /**
9307
+ * Required station-owned production stages that are missing or cannot currently run, including the final sovereign mint. These are operational blockers rather than public supply requests; external inputs that players can deliver remain listed separately in shortages. Omitted when all required stages are available and operational.
9308
+ */
9309
+ internal_blockers?: Array<SovereignMintInternalBlocker>;
9310
+ /**
9311
+ * Stable item ID produced by this sovereign mint.
9312
+ */
9313
+ output_item_id: string;
9314
+ /**
9315
+ * Display name of output_item_id. Falls back to output_item_id when the item definition is unavailable.
9316
+ */
9317
+ output_name?: string;
9318
+ /**
9319
+ * Supply guidance present whenever shortages is non-empty. Directs players to sell only inputs with buy_order_available=true and otherwise reports that the station must arrange procurement. Check ordinary market listings for current prices and order depth. Internal Trade Ciphers are not normal player procurement.
9320
+ */
9321
+ remediation?: string;
9322
+ /**
9323
+ * Externally procurable root inputs insufficient to queue the next relevant mint-chain recipe run. Trade Crystals appear first when present. An intermediate made by an installed station feeder is expanded into that feeder's inputs rather than presented as a separate conjunctive bill. Omitted when no root input is short.
9324
+ */
9325
+ shortages?: Array<SovereignMintInputShortage>;
9326
+ /**
9327
+ * Why authenticator production is offline: blocked_inputs when one or more external root inputs are short, or blocked_internal when a required station-owned production stage — including the final sovereign mint — is missing or cannot run.
9328
+ */
9329
+ status: 'blocked_inputs' | 'blocked_internal';
9330
+ };
8617
9331
  export type StationConfigResponse = {
8618
9332
  action: string;
8619
9333
  allow_outsider_facilities: boolean;
@@ -8815,6 +9529,10 @@ export type SubscribeMarketResponse = {
8815
9529
  export type SubscribeObservationResponse = {
8816
9530
  action: string;
8817
9531
  active_scan: boolean;
9532
+ /**
9533
+ * Challenge enemies fighting an arena match held at the watched POI, the same set get_nearby returns there. Omitted when no NPC challenge is in progress at this POI, which is the usual case: enemies exist only for the length of one match. While a match runs their hull and shield move every tick, so expect an arena_npcs_changed entry in most observation_update messages until it ends.
9534
+ */
9535
+ arena_npcs?: Array<ArenaNpcInfo>;
8818
9536
  cloaked_contacts?: Array<ScanContact>;
8819
9537
  creatures?: Array<CreatureInfo>;
8820
9538
  empire_npcs?: Array<EmpireNpcInfo>;
@@ -8979,10 +9697,25 @@ export type TaxEstimateIncomeRow = {
8979
9697
  rate_bps: number;
8980
9698
  };
8981
9699
  export type TaxEstimatePropertyRow = {
9700
+ /**
9701
+ * Owned hull and fitted module value in credits assessed independently by this empire.
9702
+ */
8982
9703
  assessed_value: number;
9704
+ /**
9705
+ * Progressive assessment detail when applicable. Omitted for flat rates and when inactivity_exempt is true.
9706
+ */
8983
9707
  brackets?: Array<TaxEstimateBracketRow>;
9708
+ /**
9709
+ * Citizenship empire assessing this property.
9710
+ */
8984
9711
  empire: string;
9712
+ /**
9713
+ * Projected property tax in credits; zero when inactivity_exempt is true even if the normal rate is positive.
9714
+ */
8985
9715
  owed: number;
9716
+ /**
9717
+ * Normal property rate in basis points or effective rate for a progressive schedule before any inactivity exemption. 100 basis points is one percent.
9718
+ */
8986
9719
  rate_bps: number;
8987
9720
  };
8988
9721
  export type TaxEstimatePropertyShipRow = {
@@ -8990,25 +9723,101 @@ export type TaxEstimatePropertyShipRow = {
8990
9723
  value: number;
8991
9724
  };
8992
9725
  export type TaxEstimateResponse = {
9726
+ /**
9727
+ * Command name: get_tax_estimate.
9728
+ */
8993
9729
  action: string;
9730
+ /**
9731
+ * Current value in credits per owned ship; an empty list means no assessed ships.
9732
+ */
8994
9733
  assessed_property_by_ship: Array<TaxEstimatePropertyShipRow>;
9734
+ /**
9735
+ * Total current owned hull and fitted module value in credits; retained when exempt.
9736
+ */
8995
9737
  assessed_property_value: number;
9738
+ /**
9739
+ * True when this character currently qualifies to skip weekly income and property tax for inactivity after a fully observed assessment period. Gameplay or taxable income before assessment removes the exemption. Existing debt remains payable.
9740
+ */
9741
+ inactivity_exempt: boolean;
9742
+ /**
9743
+ * Income tax projected by citizenship empire in assessment order; empty means no empire assessment.
9744
+ */
8996
9745
  income_tax: Array<TaxEstimateIncomeRow>;
9746
+ /**
9747
+ * Sum of income_tax owed amounts in credits for the pending assessment only.
9748
+ */
8997
9749
  income_tax_total: number;
9750
+ /**
9751
+ * Unix timestamp in seconds of the last income assessment; omitted when none is recorded.
9752
+ */
8998
9753
  last_assessed_at?: number;
9754
+ /**
9755
+ * Unix timestamp in seconds of the last property assessment; omitted when none is recorded.
9756
+ */
8999
9757
  last_property_assessed_at?: number;
9758
+ /**
9759
+ * Latest saved weekly statement for this character. Omitted before the first statement. Values describe the completed cycle and do not change when an old bounty is later paid; outstanding_bounties gives current debt.
9760
+ */
9761
+ latest_statement?: TaxStatement;
9762
+ /**
9763
+ * Credits of market purchases and incoming loss deducted against market sales; cannot exceed market sales.
9764
+ */
9000
9765
  market_cost_of_goods_deducted: number;
9766
+ /**
9767
+ * Unused market deduction brought forward from previous periods in credits; zero means none.
9768
+ */
9001
9769
  market_loss_carryforward?: number;
9770
+ /**
9771
+ * Gross market sales in credits sampled since the previous income assessment.
9772
+ */
9002
9773
  market_sales_to_date: number;
9774
+ /**
9775
+ * Approximate seconds until the next weekly tick boundary: remaining ticks times configured tick duration rounded down to seconds. Paused ticks and later tick-rate changes alter the actual time.
9776
+ */
9003
9777
  next_assessment_approx_seconds: number;
9778
+ /**
9779
+ * Additional assessment explanation; omitted when no explanation applies.
9780
+ */
9004
9781
  note?: string;
9782
+ /**
9783
+ * Current full settlement amounts by empire in credits including missed taxes and other crimes. Empty means no outstanding bounty. These amounts are separate from the next assessment and are paid with pay_bounty rather than prepay_tax.
9784
+ */
9785
+ outstanding_bounties: Array<PayBountyOutstandingRow>;
9786
+ /**
9787
+ * Instructions for paying existing debt remotely and reserving credits for the next assessment.
9788
+ */
9789
+ payment_guidance: string;
9790
+ /**
9791
+ * Property tax projected independently per citizenship empire; owed is zero when inactivity_exempt is true.
9792
+ */
9005
9793
  property_tax: Array<TaxEstimatePropertyRow>;
9794
+ /**
9795
+ * Sum of property_tax owed amounts in credits; zero when inactivity_exempt is true.
9796
+ */
9006
9797
  property_tax_total: number;
9798
+ /**
9799
+ * Current purchase tax rates by empire; these are separate from weekly income and property tax.
9800
+ */
9007
9801
  sales_tax_rates: Array<TaxEstimateSalesRow>;
9802
+ /**
9803
+ * True when assessments collect credits. False means preview only with no tax deductions or new debt; unused prepayment can still be refunded.
9804
+ */
9008
9805
  tax_collection_active: boolean;
9806
+ /**
9807
+ * Credits reserved for the next assessment; consumed before the wallet and any surplus refunded. Does not pay existing debt.
9808
+ */
9009
9809
  tax_prepaid: number;
9810
+ /**
9811
+ * Gross taxable earnings by category in credits before market deductions; an empty list means no entries.
9812
+ */
9010
9813
  taxable_income_by_source: Array<TaxableIncomeByCategoryEntry>;
9814
+ /**
9815
+ * Assessable income in credits since the last income assessment: nonmarket net income floored at zero plus taxable_market_income. Negative category adjustments cannot offset a positive market margin.
9816
+ */
9011
9817
  taxable_income_to_date: number;
9818
+ /**
9819
+ * Market sales minus market cost of goods deducted in credits.
9820
+ */
9012
9821
  taxable_market_income: number;
9013
9822
  };
9014
9823
  export type TaxEstimateSalesRow = {
@@ -9016,6 +9825,168 @@ export type TaxEstimateSalesRow = {
9016
9825
  rate_bps: number;
9017
9826
  reason: string;
9018
9827
  };
9828
+ export type TaxStatement = {
9829
+ /**
9830
+ * UTC time this weekly personal assessment completed.
9831
+ */
9832
+ assessed_at: string;
9833
+ /**
9834
+ * True when this character was exempt from weekly personal taxes for inactivity during this period.
9835
+ */
9836
+ inactivity_exempt: boolean;
9837
+ /**
9838
+ * Income assessments in citizenship order; empires with zero net tax are omitted.
9839
+ */
9840
+ income: Array<TaxStatementIncome>;
9841
+ /**
9842
+ * Gross earnings by income category in credits; missing categories contributed zero.
9843
+ */
9844
+ income_by_category: {
9845
+ [key: string]: number;
9846
+ };
9847
+ /**
9848
+ * Gross taxable earnings sampled since the previous income assessment in credits before market deductions.
9849
+ */
9850
+ income_gross: number;
9851
+ /**
9852
+ * Unused market deduction carried into the next assessment in credits.
9853
+ */
9854
+ loss_carryforward_next: number;
9855
+ /**
9856
+ * Market loss carried into this assessment in credits; any unused portion remains in loss_carryforward_next.
9857
+ */
9858
+ loss_carryforward_previous: number;
9859
+ /**
9860
+ * Market purchases plus incoming loss applied against market sales in credits; never offsets nonmarket income.
9861
+ */
9862
+ market_deduction: number;
9863
+ /**
9864
+ * Deductible market purchases sampled this period in credits.
9865
+ */
9866
+ market_purchases: number;
9867
+ /**
9868
+ * Credits consumed from the personal prepaid tax pool across income then property collection.
9869
+ */
9870
+ paid_from_prepaid: number;
9871
+ /**
9872
+ * Credits consumed from the wallet after available prepayment across income then property collection.
9873
+ */
9874
+ paid_from_wallet: number;
9875
+ /**
9876
+ * Previous weekly assessment boundary in UTC; zero time means this character has no previous weekly boundary.
9877
+ */
9878
+ period_started_at: string;
9879
+ /**
9880
+ * True when collection was disabled; obligations are estimates and no new debt is created.
9881
+ */
9882
+ preview: boolean;
9883
+ /**
9884
+ * Property assessments in citizenship order; empires with zero tax are omitted.
9885
+ */
9886
+ property: Array<TaxStatementProperty>;
9887
+ /**
9888
+ * Sum of owned ship hull and fitted module assessed values in credits.
9889
+ */
9890
+ property_value: number;
9891
+ /**
9892
+ * Unused prepaid credits returned to the wallet after this assessment.
9893
+ */
9894
+ refund: number;
9895
+ /**
9896
+ * Owned ships valued at assessment time; an empty list means no assessed ships.
9897
+ */
9898
+ ships: Array<TaxStatementShip>;
9899
+ /**
9900
+ * Assessed income in credits. Nonmarket income is income_gross minus income_by_category.market with a floor of zero. For citizens the result is nonmarket income plus positive market income minus market_deduction. Missing market means zero. Stateless assessments report income_gross. A negative gross counter adjustment skips income assessment and reports zero.
9901
+ */
9902
+ taxable_income: number;
9903
+ /**
9904
+ * Server tick of this assessment.
9905
+ */
9906
+ tick: number;
9907
+ /**
9908
+ * Sum of income and property owed in credits for this assessment only.
9909
+ */
9910
+ total_owed: number;
9911
+ /**
9912
+ * Sum of income and property paid in credits; equals paid_from_prepaid plus paid_from_wallet.
9913
+ */
9914
+ total_paid: number;
9915
+ /**
9916
+ * Unpaid credits from this assessment only; zero in preview mode. Current bounty debt can differ because of policy multipliers or later payments.
9917
+ */
9918
+ total_unpaid: number;
9919
+ };
9920
+ export type TaxStatementIncome = {
9921
+ /**
9922
+ * Progressive bracket calculations at assessment time; empty or null for a flat rate.
9923
+ */
9924
+ brackets: Array<IncomeTaxBracketBreakdown>;
9925
+ /**
9926
+ * Foreign tax credit derived from prior empires net obligations and this empire deduction policy in credits.
9927
+ */
9928
+ credit: number;
9929
+ /**
9930
+ * Empire assessing this income tax.
9931
+ */
9932
+ empire: string;
9933
+ /**
9934
+ * Income tax before foreign tax credit in credits.
9935
+ */
9936
+ gross: number;
9937
+ /**
9938
+ * Gross minus credit with a floor of zero in credits.
9939
+ */
9940
+ owed: number;
9941
+ /**
9942
+ * Credits collected for this empire income tax; zero in preview mode.
9943
+ */
9944
+ paid: number;
9945
+ /**
9946
+ * Nominal flat rate or gross tax divided by taxable income times 10000 for progressive tax; 100 basis points equals one percent.
9947
+ */
9948
+ rate_bps: number;
9949
+ /**
9950
+ * Owed minus paid in credits during collection; zero in preview mode.
9951
+ */
9952
+ unpaid: number;
9953
+ };
9954
+ export type TaxStatementProperty = {
9955
+ /**
9956
+ * Progressive bracket calculations at assessment time; empty or null for a flat rate.
9957
+ */
9958
+ brackets: Array<IncomeTaxBracketBreakdown>;
9959
+ /**
9960
+ * Empire assessing this property tax.
9961
+ */
9962
+ empire: string;
9963
+ /**
9964
+ * Property tax owed to this empire in credits; there is no foreign property tax credit.
9965
+ */
9966
+ owed: number;
9967
+ /**
9968
+ * Credits collected for this empire property tax; zero in preview mode.
9969
+ */
9970
+ paid: number;
9971
+ /**
9972
+ * Nominal flat rate or tax divided by property value times 10000 for progressive tax; 100 basis points equals one percent.
9973
+ */
9974
+ rate_bps: number;
9975
+ /**
9976
+ * Owed minus paid in credits during collection; zero in preview mode.
9977
+ */
9978
+ unpaid: number;
9979
+ };
9980
+ export type TaxStatementShip = {
9981
+ /**
9982
+ * Owned ship identifier at assessment time.
9983
+ */
9984
+ ship_id: string;
9985
+ /**
9986
+ * Assessed hull plus fitted module value in credits.
9987
+ */
9988
+ value: number;
9989
+ };
9019
9990
  export type TaxableIncomeByCategoryEntry = {
9020
9991
  amount: number;
9021
9992
  category: string;
@@ -9661,6 +10632,9 @@ export type V2NearbyEmpireNpc = {
9661
10632
  npc_id: string;
9662
10633
  role: string;
9663
10634
  ship_class?: string;
10635
+ /**
10636
+ * Display name of the ship this NPC is flying: its custom name when one is set, otherwise the ship class display name (an unnamed enforcer reads as Enforcer). Presence of this field does not mean the hull is named. Omitted only when the NPC has no resolvable ship.
10637
+ */
9664
10638
  ship_name?: string;
9665
10639
  };
9666
10640
  export type V2NearbyPirate = {
@@ -9678,6 +10652,14 @@ export type V2NearbyPirate = {
9678
10652
  max_shield: number;
9679
10653
  name: string;
9680
10654
  pirate_id: string;
10655
+ /**
10656
+ * Primary livery color configured by the pirate stronghold crew as #RRGGBB. Omitted when the crew has no configured branding.
10657
+ */
10658
+ primary_color?: string;
10659
+ /**
10660
+ * Secondary livery color configured by the pirate stronghold crew as #RRGGBB. Omitted when the crew has no configured branding.
10661
+ */
10662
+ secondary_color?: string;
9681
10663
  shield: number;
9682
10664
  status: string;
9683
10665
  tier: string;
@@ -9688,9 +10670,17 @@ export type V2NearbyPlayer = {
9688
10670
  in_combat: boolean;
9689
10671
  offline?: boolean;
9690
10672
  player_id: string;
10673
+ /**
10674
+ * Primary livery color as #RRGGBB. Omitted when the player has not set one.
10675
+ */
10676
+ primary_color?: string;
10677
+ /**
10678
+ * Secondary livery color as #RRGGBB. Omitted when the player has not set one.
10679
+ */
10680
+ secondary_color?: string;
9691
10681
  ship_class?: string;
9692
10682
  /**
9693
- * Custom ship name
10683
+ * Display name of the ship this player is flying: their custom name when they have set one, otherwise the ship class display name (an unnamed enforcer reads as Enforcer). Presence of this field does not mean the hull is named. Omitted only when the player has no resolvable current ship.
9694
10684
  */
9695
10685
  ship_name?: string;
9696
10686
  username?: string;
@@ -9766,14 +10756,34 @@ export type V2Queue = {
9766
10756
  has_pending: boolean;
9767
10757
  };
9768
10758
  export type V2Resource = {
10759
+ /**
10760
+ * Item id of the ore, gas, ice or radioactive material in this deposit — for example iron_ore or fury_crystal.
10761
+ */
9769
10762
  item_id: string;
10763
+ /**
10764
+ * Display name of the resource. Falls back to the raw item id when the catalog has no entry for it.
10765
+ */
9770
10766
  item_name: string;
10767
+ /**
10768
+ * Stock this deposit must hold for your fitted array to keep a lock on it once the deposit falls below a quarter of capacity. Below both thresholds at once extraction fails with deposit_too_sparse. Omitted when your array can never lose a lock here — either its power adjusted for precision is at most 20, or this is a deep core POI, where the hard cutoff never applies.
10769
+ */
10770
+ lock_minimum_stock?: number;
10771
+ /**
10772
+ * Units of stock left. -1 means an unlimited deposit that never depletes; 0 means fully depleted.
10773
+ */
9771
10774
  remaining: number;
10775
+ /**
10776
+ * Percentage multiplier on extraction yield: yield is applied beam power times richness divided by 100, floored at 1 unit per action.
10777
+ */
9772
10778
  richness: number;
9773
10779
  /**
9774
- * Beam power this deposit supports at full extraction rate (standard precision); omitted when depleted or unlimited
10780
+ * Beam power this deposit accepts at full extraction rate, computed for the extraction hardware you have fitted right now — remaining stock divided by 20 and by your array's precision factor. Power above it is capped down to it rather than wasted, so extraction continues at the reduced rate. Omitted when the deposit is depleted or unlimited.
9775
10781
  */
9776
10782
  supported_power?: number;
10783
+ /**
10784
+ * True when your currently fitted array cannot work this deposit at all right now. Omitted (false) whenever the deposit is workable.
10785
+ */
10786
+ too_sparse?: boolean;
9777
10787
  };
9778
10788
  /**
9779
10789
  * Standard v2 REST API response envelope.
@@ -9809,7 +10819,7 @@ export type V2Response = {
9809
10819
  /**
9810
10820
  * Notification payload. Shape depends on msg_type — see the Notification_* schemas under components.schemas.
9811
10821
  */
9812
- data?: NotificationAchievementUnlocked | NotificationActionError | NotificationArenaChallenge | NotificationActionResult | NotificationDroneAdrift | NotificationServerRestartWarning | NotificationFactionAllianceBroken | NotificationFactionAllianceFormed | NotificationFactionAllianceProposal | NotificationFactionPeaceAccepted | NotificationFactionPeaceProposal | NotificationFactionWarDeclared | NotificationBaseDestroyed | NotificationStationRepaired | NotificationRanchPoached | NotificationBaseRaidUpdate | NotificationBattleAlert | NotificationBattleDamage | NotificationBattleEnded | NotificationShipCaptured | NotificationPrizeUpdate | NotificationPersonnelUpdate | NotificationBattleJoined | NotificationBattleLeft | NotificationBattleStarted | NotificationBattleUpdate | NotificationChatMessage | NotificationCraftingUpdate | NotificationDroneDestroyed | NotificationDroneScan | NotificationDroneSurvey | NotificationDroneUpdate | NotificationFacilityReclaimed | NotificationFacilityRentWarning | NotificationMarketUpdate | NotificationObservationUpdate | NotificationMiningYield | NotificationPilotlessShip | NotificationPirateDestroyed | NotificationPirateRadio | NotificationPlayerDied | NotificationPlayerKill | NotificationReconnected | NotificationScanDetected | NotificationShipCommissionComplete | NotificationSkillLevelUp | NotificationTradeCancelled | NotificationTradeComplete | NotificationTradeDeclined | NotificationTradeOfferReceived;
10822
+ data?: NotificationPayload;
9813
10823
  id?: string;
9814
10824
  /**
9815
10825
  * Specific message subtype used for handler routing (e.g. chat_message, battle_update, action_result, mining_yield). Switch on this to pick the matching Notification_* payload schema.
@@ -9881,7 +10891,13 @@ export type V2Ship = {
9881
10891
  * Remaining ticks of incendiary/entropic burn damage-over-time (omitted when not burning)
9882
10892
  */
9883
10893
  burn_ticks_remaining?: number;
10894
+ /**
10895
+ * Total cargo space. Modules can raise or lower it, so it changes as you refit
10896
+ */
9884
10897
  cargo_capacity: number;
10898
+ /**
10899
+ * Cargo space the hold currently contains. Can exceed cargo_capacity when a fitted module reduced the hold below what was already aboard, in which case nothing more can be loaded until you jettison, sell, or unfit the module
10900
+ */
9885
10901
  cargo_used: number;
9886
10902
  class_id: string;
9887
10903
  class_name: string;
@@ -9890,7 +10906,7 @@ export type V2Ship = {
9890
10906
  */
9891
10907
  cpu_capacity: number;
9892
10908
  /**
9893
- * CPU consumed by fitted modules (after engineering efficiency bonus)
10909
+ * CPU consumed by fitted modules (after engineering efficiency bonus). Can exceed cpu_capacity when a module granting CPU was unfitted or a fit predates the capacity it needs, in which case install_mod is refused until you unfit a consumer
9894
10910
  */
9895
10911
  cpu_used: number;
9896
10912
  /**
@@ -9976,7 +10992,7 @@ export type V2Ship = {
9976
10992
  */
9977
10993
  power_capacity: number;
9978
10994
  /**
9979
- * Power consumed by fitted modules (after engineering efficiency bonus)
10995
+ * Power consumed by fitted modules (after engineering efficiency bonus). Can exceed power_capacity on the same terms as cpu_used
9980
10996
  */
9981
10997
  power_used: number;
9982
10998
  shield: number;
@@ -10240,7 +11256,9 @@ export type GetNotificationsResponses = {
10240
11256
  /**
10241
11257
  * Notifications polled
10242
11258
  */
10243
- 200: V2Response;
11259
+ 200: V2Response & {
11260
+ structuredContent?: GetNotificationsResponse;
11261
+ };
10244
11262
  };
10245
11263
  export type GetNotificationsResponse2 = GetNotificationsResponses[keyof GetNotificationsResponses];
10246
11264
  export type CreateSessionData = {
@@ -10609,7 +11627,7 @@ export type SpacemoltCraftData = {
10609
11627
  */
10610
11628
  package_ids?: Array<string>;
10611
11629
  /**
10612
- * Auto-routing preset: 'fast' (fewest ticks, default) picks the best facility globally, so a busy own facility may route to an idle public rental. 'cheap' picks the lowest fee you would actually pay — your own and your faction's facilities are free to you, so they always win. Use 'prefer_own' to keep the job on your own (then faction, then ally-granted) facility and only rent a public one when you have none that can run it. Auto-routing otherwise prefers your own facility, then your faction's, then one an allied faction has granted you access to (free to you, but queued at external priority), then a public rental, and only hand-crafts at the Station Workshop if none is available. Use 'workshop' to force hand-crafting even when you have a facility.
11630
+ * Auto-routing preset. 'fast' (default) picks the soonest finish across your own, faction, ally-granted, and (for facility-only recipes) public facilities; ownership only breaks ties, so it can pick another player's public facility over your own idle one, and a public route prepays that facility's per-run rental fee. 'cheap' picks the lowest fee you would actually pay — your own and your faction's facilities are free to you, so they always win. 'prefer_own' keeps the job on your own (then faction, then ally-granted) facility and only rents a public one when you have none that can run it. With no facility at all, jobs hand-craft at the Station Workshop; 'workshop' forces hand-crafting even when you have a facility.
10613
11631
  */
10614
11632
  preset?: 'fast' | 'cheap' | 'prefer_own' | 'workshop';
10615
11633
  /**
@@ -12042,7 +13060,7 @@ export type SpacemoltRecycleData = {
12042
13060
  [key: string]: unknown;
12043
13061
  }>;
12044
13062
  /**
12045
- * Auto-routing preset: 'fast' (fewest ticks, default) picks the best eligible recycler globally, so a busy own recycler may route to an idle public rental. 'cheap' picks the lowest fee you would actually pay — your own and your faction's recyclers are free to you, so they always win. Use 'prefer_own' to keep the job on your own (then faction, then ally-granted) recycler whenever one can run it. Auto-routing otherwise prefers your own recycler, then your faction's, then one an allied faction has granted you access to (free to you, but queued at external priority). 'workshop' doesn't apply — recycling always needs a real recycler facility.
13063
+ * Auto-routing preset. 'fast' (default) picks the soonest finish across your own, faction, and ally-granted recyclers; ownership only breaks ties. 'cheap' picks the lowest fee you would actually pay — your own and your faction's recyclers are free to you, so they always win. 'prefer_own' keeps the job on your own (then faction, then ally-granted) recycler whenever one can run it. 'workshop' doesn't apply — recycling always needs a real recycler facility.
12046
13064
  */
12047
13065
  preset?: 'fast' | 'cheap' | 'prefer_own';
12048
13066
  /**
@@ -13340,11 +14358,15 @@ export type SpacemoltBattleReloadData = {
13340
14358
  /**
13341
14359
  * Instance ID of the fitted weapon to reload (use get_ship to see weapon instance IDs)
13342
14360
  */
13343
- id: string;
14361
+ id?: string;
13344
14362
  /**
13345
14363
  * Item ID of ammo to load from cargo (must match the weapon's ammo type). For weapons with the ammo_from_cargo special: omit to auto-select random low-value junk, or specify any cargo item to load that exact item.
13346
14364
  */
13347
14365
  target?: string;
14366
+ /**
14367
+ * Bulk reload: array of {weapon_instance_id, ammo_item_id?} entries loaded in a single action for one tick, however many weapons. Omit weapon_instance_id/ammo_item_id when using this. Entries are independent — the response reports per-weapon success/failure. Maximum 50 entries.
14368
+ */
14369
+ weapons?: Array<unknown>;
13348
14370
  };
13349
14371
  path?: never;
13350
14372
  query?: never;
@@ -13366,11 +14388,11 @@ export type SpacemoltBattleReloadErrors = {
13366
14388
  };
13367
14389
  export type SpacemoltBattleReloadResponses = {
13368
14390
  /**
13369
- * Result. structuredContent: V2GameState post-mutation delta (changed ship/cargo/location/queue sections); the command result is under `details` (ReloadResponse)
14391
+ * Result. structuredContent: V2GameState post-mutation delta (changed ship/cargo/location/queue sections); the command result is under `details` (ReloadResponse | BulkReloadResponse)
13370
14392
  */
13371
14393
  200: V2Response & {
13372
14394
  structuredContent?: V2GameState & {
13373
- details?: ReloadResponse;
14395
+ details?: ReloadResponse | BulkReloadResponse;
13374
14396
  };
13375
14397
  };
13376
14398
  };
@@ -14454,7 +15476,7 @@ export type SpacemoltFacilityBuyListingResponse = SpacemoltFacilityBuyListingRes
14454
15476
  export type SpacemoltFacilityBuyShipLicenseData = {
14455
15477
  body?: {
14456
15478
  /**
14457
- * Ship class id to license (from ship_catalog), e.g. solarian_frigate
15479
+ * Ship class id to license (from catalog type=ships), e.g. solarian_frigate
14458
15480
  */
14459
15481
  ship_class: string;
14460
15482
  };
@@ -17475,6 +18497,10 @@ export type SpacemoltFactionAdminPostMissionData = {
17475
18497
  objectives: Array<{
17476
18498
  description: string;
17477
18499
  item_id?: string;
18500
+ /**
18501
+ * Optional pirate role ID for kill_pirate objectives; omit to count any role. Must name an existing pirate role.
18502
+ */
18503
+ pirate_tier?: string;
17478
18504
  quantity?: number;
17479
18505
  system_id?: string;
17480
18506
  /**
@@ -17495,9 +18521,12 @@ export type SpacemoltFactionAdminPostMissionData = {
17495
18521
  */
17496
18522
  rewards: {
17497
18523
  credits?: number;
17498
- items?: Array<{
17499
- [key: string]: unknown;
17500
- }>;
18524
+ /**
18525
+ * Item IDs mapped to reward quantities
18526
+ */
18527
+ items?: {
18528
+ [key: string]: number;
18529
+ };
17501
18530
  };
17502
18531
  /**
17503
18532
  * Mission title
@@ -18415,7 +19444,7 @@ export type SpacemoltIntelScanPoiResponse = SpacemoltIntelScanPoiResponses[keyof
18415
19444
  export type SpacemoltIntelSubmitIntelData = {
18416
19445
  body?: {
18417
19446
  /**
18418
- * Array of system intel reports. Each entry: system_id (required), name (required), description, empire, police_level, connections (array of {system_id, name, distance} objects or bare ID strings), pois (array of {id, type, name, description, class, position:{x,y}, base_id, base_name, resources:[{resource_id, richness, remaining, max_remaining}]})
19447
+ * Array of system intel reports. Each entry: system_id (required), name (required), description, empire, police_level, connections (array of {system_id, name, distance} objects or bare ID strings), pois (array of {id, type, name, description, class, position:{x,y}, base_id, base_name, deep_core, resources:[{resource_id, richness, remaining, max_remaining}]}). deep_core marks a hidden deep core POI, where the mining too-sparse cutoff never applies
18419
19448
  */
18420
19449
  systems: Array<{
18421
19450
  [key: string]: unknown;
@@ -19114,7 +20143,7 @@ export type SpacemoltSalvageLootData = {
19114
20143
  */
19115
20144
  item_id?: string;
19116
20145
  /**
19117
- * Module instance ID to loot directly onto your ship (requires free slot, CPU, and power). Get module IDs from get_wrecks. CPU and power usage shown reflect your Engineering skill bonus (1% reduction per level).
20146
+ * Module instance ID to loot into your cargo hold. Get module IDs from get_wrecks; fit it later at a station with install_mod.
19118
20147
  */
19119
20148
  module_id?: string;
19120
20149
  /**
@@ -19319,7 +20348,11 @@ export type SpacemoltSalvageServicePrizeData = {
19319
20348
  */
19320
20349
  id: string;
19321
20350
  /**
19322
- * Optional quantity. For refuel, zero or omission transfers the safe maximum; for repair, zero or omission uses one repair kit.
20351
+ * Optional repair item to spend on repair. Omit to use the cheapest repair item in your cargo.
20352
+ */
20353
+ item_id?: string;
20354
+ /**
20355
+ * Optional quantity. For refuel, zero or omission transfers the safe maximum; for repair, zero or omission uses one repair item.
19323
20356
  */
19324
20357
  quantity?: number;
19325
20358
  /**
@@ -19702,7 +20735,7 @@ export type SpacemoltShipCommissionShipData = {
19702
20735
  */
19703
20736
  fund_from_faction?: boolean;
19704
20737
  /**
19705
- * Ship class ID to commission (use ship_catalog to see options)
20738
+ * Ship class ID to commission (use catalog type=ships to see options)
19706
20739
  */
19707
20740
  id: string;
19708
20741
  /**
@@ -22155,7 +23188,7 @@ export type SpacemoltStorageLootData = {
22155
23188
  */
22156
23189
  item_id?: string;
22157
23190
  /**
22158
- * Module instance ID to loot directly onto your ship (requires free slot, CPU, and power). Get module IDs from get_wrecks. CPU and power usage shown reflect your Engineering skill bonus (1% reduction per level).
23191
+ * Module instance ID to loot into your cargo hold. Get module IDs from get_wrecks; fit it later at a station with install_mod.
22159
23192
  */
22160
23193
  module_id?: string;
22161
23194
  /**