How to use it
Two steps to looking something up in the galaxy.
1 Turn web access on. It is off out of the box.
Turn on Let D47 search the web in the Web access settings.
The row shows on; it is off until you switch it, and the Privacy page lists the sites it may reach.
2 Ask.
Say "where is the nearest material trader" or "find me a neutron star".
D47 answers and names its source, so you can tell a lookup from a guess.
! The one that stops people.
Turn web access on before you ask.
The lookup runs; with web access off D47 says it is off rather than inventing an answer.
Why it works this way
Looking things up in the galaxy — the first thing D47 does that needs the internet.
1 Off until you turn it on.
2 The other one runs the other way.
You never have to take this page's word for any of it. The Privacy report works the same list out from your actual settings rather than repeating it here, so a page going stale cannot make it wrong.
The details
Look up star systems, and work out how far apart two of them are.
“how far is Colonia” “find a high tech system within 30 light years” “what’s the nearest Federation system”
This is the first thing d47 does that needs the internet. It asks spansh.co.uk, which indexes the galaxy from data Commanders share — and, for one commodity’s prices, Ardent Insight, which applies the same Commanders’ reports as each one arrives. Both are behind the one setting below, and it is off until you turn it on.
Look things up in the galaxy
The one setting. Off by default.
When it is off, asking about a system gets you “Galaxy search is switched off, so I can’t look that up” — a capability that is off, not an error, so the conversation carries on. When it is on, three things leave this machine:
- the system name you asked about, and any filters — an allegiance, a distance, an economy
- where you are, whenever the question is relative to you, because “the nearest high tech system” cannot be asked without saying where from
- the letters you type into a field that suggests system or faction names, such as the one on Search › System, sent as you type once there are three of them
- when you ask for a home system suggestion: the names of systems you have claimed for colonisation, your pledged Power, your squadron’s minor faction, and your position for a search within 200 light years
No key and no identifier goes with any of it. The Privacy section computes this same list rather than repeating it by hand, so it cannot go stale.
Turning it on takes effect immediately. There is no restart.
Notable places for short stories
A second setting, added with list.md Phase 47 and off by default, and a second host. When the core writes you a short story it may pick the story’s stops from the Galactic Exploration Catalog on edastro.com — the community catalogue of nebulae, notable bodies, wrecks, memorials and tourist sites that the Galactic Mapping Project was migrated into. One request fetches the whole catalogue, about two megabytes, and the choosing by distance happens on this machine: where you are never leaves it, and nothing about you goes with the request. The catalogue is kept in memory for a few hours so a draft and its revisions do not fetch it three times, and it is never written to disk.
A lookup and never a copy. Nothing from the catalogue is written into d47’s own tables; the
catalogue’s one-line descriptions reach the model labelled as third-party information, and every
place it suggests is still checked against spansh’s id for the system before a story can be
offered — two sources, and a disagreement refuses the place. Its content is CC BY-NC-SA 3.0,
acknowledged in NOTICE; d47 is non-commercial.
A long-haul story’s chapter may also be a sightseeing chapter, which sends you to one of these places. The same request serves it, and the choosing by distance is again done on this machine. With this off, or when the catalogue cannot be reached, no chapter is a sightseeing chapter and the chapter is still written.
With this off, a generated short story still works, choosing its stops from the galaxy search and the model’s own knowledge. With galaxy search off, no short story can be generated at all, because the places in a story have to be real and this is the thing that checks.
Earlier biology finds from Canonn
A setting off by default, and a host of its own. With it on, mapping a body that has biological
signals sends the name of the system you are in to Canonn’s query API at
us-central1-canonn-api-236217.cloudfunctions.net, which answers with the codex entries other
Commanders logged there. Nothing else goes with it: no Commander name, key or identifier. A system
is asked at most once a session, and never on arrival. The
earlier finds callout says what comes back.
With this off, nothing is sent to Canonn.
BGS tick time
A third setting, off by default, and a third host. While it is on and Elite is running, d47 asks
the community tick detector at tick.infomancer.uk when the last background simulation tick
happened: once when the setting is turned on or at startup, then every ten minutes. Nothing about
you goes with the request — no key, no Commander name, no position and nothing from your journal.
The host answers only over plain HTTP, so the request is not encrypted: anyone on the network path can see that d47 asked, and could change the time that comes back. d47 uses the answer only when it is a UTC time no more than five minutes ahead of now, no more than seven days old, and not earlier than the tick it already holds; anything else is ignored and the held time stays. The time is kept across restarts.
GalNet news
Off by default, with a host of its own. While it is on, d47 asks Frontier’s GalNet server at
cms.zaonce.net for the newest articles when it starts and every hour while it runs, whether or not
Elite is running. The first time, it also reads back up to two years of older articles. Nothing about
you goes with the request: no key, no Commander name and nothing from your journal.
The articles are kept in data\galnet.json on this PC and never pruned. An article Frontier edits
replaces the kept copy. A fetch that fails leaves the file as it was. Turning the setting off stops the
requests; the kept articles stay.
Server status
Off by default, with a host of its own. While it is on, d47 asks Frontier’s server status page at
ed-server-status.orerve.net whether Elite’s servers are up when it starts, then every ten minutes while the
answer is Online and every minute otherwise, whether or not Elite is running. Nothing about you goes with the
request: no key, no Commander name and nothing from your journal.
The title bar shows the latest answer left of HELP as SERVERS ONLINE, MAINTENANCE, OFFLINE or
UNKNOWN; Unknown means the request failed or the answer could not be read. Nothing is shown while the
setting is off or before the first answer. Frontier’s Good is Online, Maintenance is Maintenance and any
other status is Offline. Turning the setting off stops the requests and hides the readout.
Signal index
A fourth setting, off by default. While it is on, a signal search can also answer from a daily
index of the signals other Commanders have scanned and uploaded to EDDN — nav beacons, resource
extraction sites, megaships, installations and the like. The project builds the index once a day
and publishes it as signals.tsv.gz on the signals-1 release on github.com.
D47 downloads it only when you search for a signal and the copy in data\signals is missing or
more than 20 hours old. Nothing about you goes with the request, and the search happens on this
machine. A download replaces the copy on disk only once it reads as an index; one that fails
leaves the old copy in use and is tried again on a later search, no sooner than an hour after.
The data backups taken when a new build starts leave data\signals out.
With this off, nothing is downloaded and a signal search answers from your own scans alone.
Share with EDDN
A setting in Sharing, under Outside sources, off by default. While it is on, opening a station’s commodity market while d47 is running sends that market’s prices to EDDN, the relay the galaxy sites read, so other Commanders’ searches see them. Each commodity’s buy and sell price, stock and demand goes, with the station, its market id and its system, the game’s version and build, whether Horizons and Odyssey are running, and a random number made on this PC for your Commander. Opening a station’s outfitting or shipyard sends the names of the modules and ships it sells, with no prices. The signals and body counts your system scanner finds are sent too, with the system’s name and position. Codex discoveries, settlements you approach, nav beacon scans and routes you plot go too; a plotted route is where you intend to go, not something the galaxy shows.
Your Commander name does not go. The random number stands in for it, one per Commander, kept in
data\eddn-uploaders.json; it is not the donation number and not the story-ratings number. Not
your Frontier ID, credits, cargo, ship or any key goes either. Only what happens while d47 is
running is sent: journals read from before it started, a market opened more than five minutes
ago, and anything while Elite runs a different Commander than the one shown are never sent. A
Debug build sends to EDDN’s test schemas.
Messages are sent in the background, from a queue of at most 100. A refusal is not tried again; a timeout or a server error is tried again no sooner than 60 seconds later, up to three tries in all. Nothing is written to disk. The model cannot turn the setting on. If another program already sends your game data to EDDN, leave this off: sending it twice adds nothing. With it off, nothing is sent.
Why the filters are checked here rather than there
The search service ignores filter keys it does not recognise. It does not reject them or warn about them. Measured against the live service on 2026-08-14, within 20 light years of Sol:
| Request | Result |
|---|---|
allegiance: ["Federation"] |
60 systems |
allegience: ["Federation"] (misspelled) |
108 systems |
not_a_real_filter: ["Federation"] |
108 systems |
| no allegiance filter at all | 108 systems |
The misspelled row is the dangerous one. Nothing fails, nothing warns, and the answer that comes back is a perfectly good answer to a question nobody asked — you asked for Federation systems and got every system, presented as though the filter had applied.
So d47 keeps its own closed list of filters and refuses one it does not know before building a request. If you ask for something that is not on the list, you get told what is, rather than a confident wrong answer. This is the first guardrail — never invent game data — applied to a service that will let you invent it without complaint.
The filters are distance, allegiance, government, primary_economy, security, state,
faction, faction_state, faction_government, controlling_faction, power, power_state,
population and colonised. Ranges take
one number for an upper bound (30 means within 30) or two separated by a dash (10-50), so a
population of 0 means unpopulated.
Each search kind has its own keys
The systems, stations and bodies searches do not share keys. One list of filters in
GalaxyQuery.cs carries each filter’s key per search kind, and no key for a kind whose index does
not honour it. A tool offers exactly its kind’s filters, and a filter asked of a kind that does not
honour it is refused by name. Probed on 2026-10-03 around Sol, each against a no-filter control and
an unknown key:
| Concept | Systems (30 ly, control 287) | Stations (20 ly, control 3,601) | Bodies (20 ly, control 1,315) |
|---|---|---|---|
| Controlling power, Jerome Archer | controlling_power 191 |
system_controlling_power 2,528 |
system_controlling_power 916 |
| Powerplay state, Fortified | power_state 70 |
system_power_state 1,284 |
system_power_state 387 |
| Population | population comparison 0–0: 11; 1–1,000,000: 113 |
system_population comparison 0–0: 0; 1e9–1e12: 548 |
ignored |
| Colonised | is_colonised true: 5 of 26 at 12 ly |
system_is_colonised true: 522 |
ignored |
| Allegiance, government, security | honoured | system_* ignored; security ignored |
ignored |
The systems and stations searches carry all of them. The body search carries power and power_state, and
refuses the rest by name.
A boolean filter cannot express false
is_colonised returned the same 5 systems for "true", "false", "False", JSON true and JSON
false. So colonised means “only colonised systems”: true sends "true", and false sends nothing.
Population takes the comparison shape
The service drops population in the {"min","max"} shape that distance uses. Within 15 light
years of Sol, where 48 of the 51 systems are populated:
| Request | Systems returned |
|---|---|
| no filter at all | 51 |
population: {"min":"0","max":"0"} |
51 |
population: {"value":["0","0"],"comparison":"<=>"} |
4 |
population: {"value":["1","1000000000000"],"comparison":"<=>"} |
47 |
So population is sent as a comparison: {"value":["min","max"],"comparison":"<=>"}. distance
is the one numeric filter the service honours in the min/max shape.
A worse trap than the misspelling: a real filter that matches nothing
state is not sent under the name state, and finding that out cost a measurement rather than a
guess. There is a field called state. It has its own published value list carrying exactly the
twenty-one words this filter accepts, and it is honoured rather than dropped. It also matches
nothing — zero systems for every value, including None, where a bogus key returns the unfiltered
count. No result row carries a state field at all.
| Request, within 200 light years of Sol | Result |
|---|---|
| no state filter | 10,000 (the cap) |
state: ["Boom"] |
0 |
state: ["None"] |
0 |
controlling_minor_faction_state: ["Boom"] |
1,286 |
controlling_minor_faction_state: ["Outbreak"] |
68 |
Measured 2026-08-15. This fails as an empty answer rather than a wrong one, which is worse than the misspelling above: “there are no systems in Boom near you” reads as a fact about the galaxy, and a Commander has no way to tell it from one. So d47 offers the short word and sends the long key.
The state itself is crowd-reported and turns over on the background simulation’s tick, so the answer says systems reported in Boom — the same framing the station stock carries.
What comes back
One system record from the service is 268 KB — every body, every station, every market. A search returning three systems is 44 KB. None of that reaches the model: d47 reads six fields per system and drops the rest, so the answer is a handful of facts that can be said out loud in a cockpit rather than a database dump billed by the token.
The station list is read for its length and then discarded. How many stations a system has is worth saying; which ones they are is the next question.
Results always say how many matched in total, not just how many were read out. “412 systems matched; here are the nearest 5” is a different answer from “there are 5”.
Where to buy it, and what it costs there
Where can I buy tritium? — and, the same question read backwards, where do I dump 700 tonnes of it?
How much you want is part of the question, not a detail. A station 40 light years further out that is 200 credits a tonne cheaper is the wrong answer for eight tonnes and the right one for seven hundred and eighty. Tell Directive 47 the tonnage and it ranks by what the whole load costs to go and get; leave it out and it ranks by price and tells you the distance.
Say the tonnage and stations that cannot fill the order drop out entirely. The cheapest steel in the bubble is not an answer if the station is holding nine tonnes of it.
Every price has a date on it, and this is the part to take seriously. Prices come from other Commanders docking and sharing what they saw. Supply ages fastest of all — a colonisation rush strips a station in hours — so an answer that sounded current would be worse than one that admits it is a month old:
Best for buying 700 tonnes of Tritium within 50 ly of Sol: Jameson Memorial (Shinrarta Dezhra),
14.5 ly, 42,050 cr a tonne, 12,400 in stock, 29,435,000 cr for the load — reported 6 hours ago.
A market you stood in yourself is labelled as yours, because it is the one figure with no caveat. Stations dropped for quoting prices too old to trust are counted rather than silently skipped — “nothing within fifty light years” and “eleven stations, all quoting last month” are different answers, and only one of them means you should look further out.
Fleet carriers are left out unless you ask for one. Their prices are set by their owner and can be a joke, and the carrier may be a hundred light years away by the time you arrive.
The radius answered is the radius searched
The search asks for the commodity by name. It fetches a fixed number of the nearest markets — 150 — and near a busy system those 150 are only a few light years across. So it narrows the request to stations that actually hold stock of the thing you asked about, and spends the whole 150 on those.
That is there because of what happened without it. Asked for the closest place to buy 200 Landmines near Eurybia, Directive 47 said there was none within 250 light years — twice, with rising confidence — while its own data source had 5,229 units eleven light years away. The 150 nearest markets to Eurybia carried none, and “none of the ones I looked at” had been reported as “none in the radius”.
And where it still runs short, it says so. If the 150 run out before the radius does, a negative answer names the distance actually reached rather than the one you asked about:
Nothing in the 150 markets I could check is buying Land Mines in 200 tonne lots. Those reach
14.2 light years of the 250 you asked about, so there is more out there I have not looked at.
Nothing extra is fetched for any of this. The trade route planner already pulls whole markets for everything in range and already caches them, so asking about two commodities in one evening costs one lookup, and the ranking runs here on your own machine.
When it cannot answer
Everything that can go wrong becomes a sentence rather than an error: the service being unreachable, rate limiting you, taking too long, or having no record of the system you named. A system the service does not know produces “I couldn’t find one of those systems”, not a failed turn.
Quick searches
Eleven fixed searches run by phrase with no model involved, measured from the Commander’s own system. Each has four phrases: “{name} search”, “run the {name} search”, “nearest {name}” and “find the nearest {name}”. They run only while “Look things up in the galaxy” is on.
| Name | Tool | Arguments |
|---|---|---|
| raw material trader | search_stations |
material_trader Raw |
| manufactured material trader | search_stations |
material_trader Manufactured |
| encoded material trader | search_stations |
material_trader Encoded |
| guardian technology broker | search_stations |
technology_broker Guardian |
| human technology broker | search_stations |
technology_broker Human |
| interstellar factors | search_stations |
services Interstellar Factors |
| universal cartographics | search_stations |
services Universal Cartographics |
| vista genomics | search_stations |
services Vista Genomics |
| black market | search_stations |
services Black Market |
| pioneer supplies | search_stations |
services Pioneer Supplies |
| anarchy outbreak | search_systems |
government Anarchy, state Outbreak |
yield return new DynamicCommand(phrase, GalaxyCapability.Id, search.Tool, search.Arguments);
Tools
search_systems
Find star systems matching some criteria, nearest first.
{"type":"object","properties":{"allegiance":{"type":"string","description":"Superpower allegiance.","enum":["Alliance","Empire","Federation","Guardian","Independent","Pilots Federation","Thargoid"]},"colonised":{"type":"boolean","description":"Only colonised systems."},"controlling_faction":{"type":"string","description":"The controlling minor faction, by its exact name."},"distance":{"type":"string","description":"How far to look, in light years."},"faction":{"type":"string","description":"A minor faction present in the system, by its exact name."},"faction_government":{"type":"string","description":"The form of government of any faction present. With faction or faction_state, the same faction. One or more, comma-separated: Anarchy, Communism, Confederacy, Cooperative, Corporate, Democracy, Dictatorship, Feudal, None, Patronage, Prison, Prison Colony, Theocracy."},"faction_state":{"type":"string","description":"What any faction present is going through. Crowd-reported. With faction or faction_government, the same faction. One or more, comma-separated: Blight, Boom, Bust, Civil Liberty, Civil Unrest, Civil War, Drought, Election, Expansion, Famine, Infrastructure Failure, Investment, Lockdown, Natural Disaster, None, Outbreak, Pirate Attack, Public Holiday, Retreat, Terrorist Attack, War."},"government":{"type":"string","description":"Form of government.","enum":["Anarchy","Communism","Confederacy","Cooperative","Corporate","Democracy","Dictatorship","Feudal","None","Patronage","Prison","Prison Colony","Theocracy"]},"limit":{"type":"integer","description":"How many to return, 1 to 100. Default 25."},"max_report_age_hours":{"type":"integer","description":"Leave out reports older than this many hours, 1 to 8,760. Absent or 0 means any age."},"near":{"type":"string","description":"Measure from this system. Defaults to theirs."},"order":{"type":"string","description":"asc or desc. Default is the usual direction for order_by: desc for population, updated, asc for the rest.","enum":["asc","desc"]},"order_by":{"type":"string","description":"What to sort by across the whole search, not only the rows shown. Default distance, nearest first.","enum":["distance","name","allegiance","government","economy","security","power","population","updated"]},"population":{"type":"string","description":"How many people live there. \u00220\u0022 means unpopulated."},"power":{"type":"string","description":"The Powerplay power controlling the system.","enum":["A. Lavigny-Duval","Aisling Duval","Archon Delaine","Denton Patreus","Edmund Mahon","Felicia Winters","Jerome Archer","Li Yong-Rui","Nakato Kaine","Pranav Antal","Yuri Grom","Zemina Torval"]},"power_state":{"type":"string","description":"The system\u0027s Powerplay state.","enum":["Exploited","Fortified","Stronghold","Unoccupied"]},"primary_economy":{"type":"string","description":"The system\u0027s main economy.","enum":["Agriculture","Colony","Extraction","High Tech","Industrial","Military","None","Refinery","Service","Terraforming","Tourism"]},"security":{"type":"string","description":"Security level.","enum":["Anarchy","High","Low","Medium"]},"state":{"type":"string","description":"What the controlling faction is going through. Crowd-reported, so this finds systems reported in that state.","enum":["Blight","Boom","Bust","Civil Liberty","Civil Unrest","Civil War","Drought","Election","Expansion","Famine","Infrastructure Failure","Investment","Lockdown","Natural Disaster","None","Outbreak","Pirate Attack","Public Holiday","Retreat","Terrorist Attack","War"]}},"required":[],"additionalProperties":false}
A search with no filters is run: it returns the nearest systems, or the top of the whole galaxy when order_by is given.
order_by sorts the whole search, not the rows shown. The service sorts on distance,
name, allegiance, government, economy, security, power, population and updated, so
“the most populous systems near me” is order_by: population and asks for the top of the whole
search. order is asc or desc; left out, it is the field’s usual direction, which is desc
for population and updated. search_stations and find_body take the same two arguments
with their own fields, and a column the service cannot sort on has no header to press on the
Search tab.
A faction or controlling_faction value is matched against the minor factions the Commander’s
journals name, and sent in the journal’s spelling when one matches. The service needs the exact
name, so a name that matches none is sent as given, and an empty result then says the name may be
misspelled rather than that the faction is absent.
state is the controlling faction’s state; faction_state matches a system where any faction
present is in one of the named states, and faction_government one where any faction present has
one of the named governments. Both take one or more values, comma-separated. faction,
faction_state and faction_government in one search describe one faction, and are sent together
as one element of minor_faction_presences:
{"minor_faction_presences":[{"name":{"value":["Sol Nationalists"]},"state":{"value":["Drought"]}}]}
Probed on 2026-10-09, systems within 60 light years of Sol (control 2,093, an unknown sub-key 2,093): the controlling faction in Civil Unrest 17, any faction present in Civil Unrest 82, a Corporate faction in Civil Unrest as one element 39, and the same as two elements, which may be two different factions, 80. The state is the one Spansh reports for each faction, though a faction can hold several at once.
On a faction search, each system in the answer also names its controlling faction, the named
faction’s influence there, and the date the system was last reported. The service sends influence
as a fraction of 1, and the answer gives it as a percentage. A faction_state or
faction_government search names the controlling faction, the report date, and each faction that
matched with the state or government asked about, such as “Barnard’s Star Alliance in Civil
Unrest”. Searches without a faction filter leave these out. A search with a power or power_state filter names each system’s controlling
power and its Powerplay state.
Every answer is kept as the last systems search, with the arguments as given, the system it was measured from, the result and what was said. A search that fails keeps nothing.
search_stations
Find stations by type, landing pad, distance from arrival, services, material trader, technology broker, a module or ship sold there, or their system’s filters, nearest first.
{"type":"object","properties":{"allegiance":{"type":"string","description":"Superpower allegiance.","enum":["Alliance","Empire","Federation","Guardian","Independent","Pilots Federation","Thargoid"]},"colonised":{"type":"boolean","description":"Only colonised systems."},"controlling_faction":{"type":"string","description":"The controlling minor faction, by its exact name."},"government":{"type":"string","description":"Form of government.","enum":["Anarchy","Communism","Confederacy","Cooperative","Corporate","Democracy","Dictatorship","Feudal","None","Patronage","Prison","Prison Colony","Theocracy"]},"limit":{"type":"integer","description":"How many to return, 1 to 100. Default 25."},"material_trader":{"type":"string","description":"A material trader of this kind.","enum":["Raw","Manufactured","Encoded"]},"max_distance":{"type":"number","description":"How far to look, in light years. Default 50."},"max_report_age_hours":{"type":"integer","description":"Leave out reports older than this many hours, 1 to 8,760. Absent or 0 means any age."},"max_station_distance":{"type":"number","description":"Furthest from the star, in light seconds."},"min_pad":{"type":"string","description":"Large, or Medium for at least one medium pad.","enum":["Medium","Large"]},"module":{"type":"string","description":"A module sold there, by name."},"module_class":{"type":"string","description":"Module size, 0 to 8.","enum":["0","1","2","3","4","5","6","7","8"]},"module_rating":{"type":"string","description":"Module rating, A to I.","enum":["A","B","C","D","E","F","G","H","I"]},"near":{"type":"string","description":"Search out from this system. Defaults to theirs."},"order":{"type":"string","description":"asc or desc. Default is the usual direction for order_by: desc for updated, asc for the rest.","enum":["asc","desc"]},"order_by":{"type":"string","description":"What to sort by across the whole search, not only the rows shown. Default distance, nearest first.","enum":["distance","name","system","from_star","updated"]},"population":{"type":"string","description":"How many people live there. \u00220\u0022 means unpopulated."},"power":{"type":"string","description":"The Powerplay power controlling the system.","enum":["A. Lavigny-Duval","Aisling Duval","Archon Delaine","Denton Patreus","Edmund Mahon","Felicia Winters","Jerome Archer","Li Yong-Rui","Nakato Kaine","Pranav Antal","Yuri Grom","Zemina Torval"]},"power_state":{"type":"string","description":"The system\u0027s Powerplay state.","enum":["Exploited","Fortified","Stronghold","Unoccupied"]},"primary_economy":{"type":"string","description":"The system\u0027s main economy.","enum":["Agriculture","Colony","Extraction","High Tech","Industrial","Military","None","Refinery","Service","Terraforming","Tourism"]},"services":{"type":"string","description":"Services the station must all have, comma-separated: Market, Black Market, Shipyard, Outfitting, Refuel, Repair, Rearm, Interstellar Factors, Material Trader, Technology Broker, Universal Cartographics, Vista Genomics, Pioneer Supplies, Bartender, Apex Interstellar, Frontline Solutions, Search and Rescue, Redemption Office, Crew Lounge, Contacts, Missions, Missions Generated, On Dock Mission, Tuning, Workshop, Refinery Contact, Powerplay, Shop, Livery, Social Space, Squadron Bank, System Colonisation, Construction Services, Fleet Carrier Administration, Fleet Carrier Fuel, Fleet Carrier Management, Fleet Carrier Vendor."},"ship":{"type":"string","description":"A ship sold there, by name."},"state":{"type":"string","description":"What the controlling faction is going through. Crowd-reported, so this finds systems reported in that state.","enum":["Blight","Boom","Bust","Civil Liberty","Civil Unrest","Civil War","Drought","Election","Expansion","Famine","Infrastructure Failure","Investment","Lockdown","Natural Disaster","None","Outbreak","Pirate Attack","Public Holiday","Retreat","Terrorist Attack","War"]},"station_economy":{"type":"string","description":"The station\u0027s own main economy. One or more, comma-separated: Agriculture, Colony, Extraction, High Tech, Industrial, Military, Prison, Private Enterprise, Refinery, Rescue, Service, Terraforming, Tourism."},"station_state":{"type":"string","description":"The station\u0027s own state. Crowd-reported, so it may be out of date. One or more, comma-separated: Construction, Damaged, DamagedHuman, UnderAttack, UnderRepairs."},"station_type":{"type":"string","description":"One or more, comma-separated: Starport, Outpost, Surface port, Settlement, Fleet carrier, Megaship."},"technology_broker":{"type":"string","description":"A technology broker of this kind.","enum":["Guardian","Human"]}},"required":[],"additionalProperties":false}
station_type takes one or more of Starport, Outpost, Surface port, Settlement, Fleet carrier and
Megaship, each sent as every one of the service’s types of that kind: Surface port is
Planetary Outpost and Planetary Port. Left out, every type but Drake-Class Carrier is sent,
so fleet carriers appear only when named. Construction depots and surface settlements have no
station_type of their own, and are found only when it is left out.
min_pad Large sends has_large_pad. Medium sends medium_pads as a comparison from 1, so it
finds stations with at least one medium pad, and a station with only large pads is left out.
max_station_distance is distance_to_arrival as a comparison from 0.
services are sent as one object per service, so a station must have every one asked for. Rearm
is sent as Restock and Interstellar Factors as Interstellar Factors Contact, the service’s own
names. material_trader and technology_broker are choices of their own.
The station search honours fewer of the system filters than the systems search does. Probed on 2026-10-03, stations within 20 light years of Sol (control 3,601, an unknown key 3,601):
| Filter | Shape | Result |
|---|---|---|
type Outpost |
choice | 104 |
has_large_pad |
choice "true" |
2,918 (and 2,918 for "false") |
medium_pads 1–100 |
comparison | 2,441 |
distance_to_arrival 0–100 Ls |
comparison | 1,403 (min/max: 3,596, ignored) |
material_trader Raw |
choice | 3 |
technology_broker Guardian |
choice | 2 |
allegiance Federation (the station’s) |
choice | 1,003 |
government Democracy (the station’s) |
choice | 434 |
controlling_minor_faction Mother Gaia |
choice | 22 |
controlling_minor_faction_state Boom |
choice | 384 |
system_primary_economy Industrial |
choice | 699 |
system_allegiance, system_government, security, system_security |
choice | 3,601, ignored |
Services, within 60 light years of Sol: Material Trader alone 149, Technology Broker alone 90, both
names in one value array 198 (either), and one object per service 41 (both).
Probed on 2026-10-09, stations within 60 light years of Sol, where the control is capped at
10,000: primary_economy Refinery, the station’s own economy, 1,598; system_primary_economy
Refinery 7,506; minor_faction_presences with a state 10,000, ignored.
So allegiance, government, state and controlling_faction are the station’s own, and
security, faction, faction_state and faction_government are refused by name: find the
system first, then its stations. primary_economy is the system’s economy; station_economy is
the station’s own, one or more of Agriculture, Colony, Extraction, High Tech, Industrial, Military,
Prison, Private Enterprise, Refinery, Rescue, Service, Terraforming and Tourism, and is refused by
search_systems.
station_state is the station’s own state, one or more of Construction, Damaged, DamagedHuman, UnderAttack
and UnderRepairs. The state is crowd-reported and may be out of date, so a search with it says each
station’s state in words, marked as reported. A controlling_faction is corrected against the
journals’ faction names as on search_systems. A search with nothing but a distance is refused.
max_distance has no upper limit in d47: any positive radius is sent as asked, and the answer’s
“within N light years” stays true. Measured on 2026-10-23 from Sol, sorted farthest first, station
searches at 500, 501, 1,000, 5,000 and 99,999 light years answered in 1.2 to 1.9 seconds, and the
farthest result lay at the radius asked for (65,647 light years at 99,999, the farthest station from
Sol in the index). Filtered searches at 99,999 answered in about 1.6 seconds.
max_report_age_hours (1 to 8,760) on search_systems, search_stations and search_outfitting, and
max_price_age_hours on the module and ship branches of find_nearest_station, leave out reports older than
that. Absent or 0 sends no bound. The bound goes to the service as a date range on outfitting_updated_at
for a module, shipyard_updated_at for a ship, and updated_at otherwise, and the answer says how far back
it looked.
The answer gives each station, its system, distance, type, largest pad, distance from arrival, and which of the asked-for services it has. Every answer is kept as the last stations search; a search that fails keeps nothing.
search_outfitting
Find stations that sell several modules, or modules and a ship, at once, nearest first.
{"type":"object","properties":{"include_carriers":{"type":"boolean","description":"Include fleet carriers. Default false."},"items":{"type":"string","description":"Comma-separated: modules by name with an optional size and rating, and at most one ship, such as \u00225A Frame Shift Drive (SCO), 6A Fuel Scoop, Python MkII\u0022."},"limit":{"type":"integer","description":"How many to return, 1 to 100. Default 25."},"max_distance":{"type":"number","description":"How far to look, in light years. Default 50."},"max_report_age_hours":{"type":"integer","description":"Leave out reports older than this many hours, 1 to 8,760. Absent or 0 means any age."},"max_station_distance":{"type":"number","description":"Furthest from the star, in light seconds."},"min_pad":{"type":"string","description":"Large, or Medium for at least one medium pad.","enum":["Medium","Large"]},"near":{"type":"string","description":"Search out from this system. Defaults to theirs."},"surface_stations":{"type":"boolean","description":"Include surface ports and settlements. Default true."}},"required":["items"],"additionalProperties":false}
items is comma-separated. A module is its catalogue name with an optional size and rating, such
as 5A Frame Shift Drive (SCO) or fuel scoop; a ship is its name, such as Python MkII. An
unmatched name is refused with the closest catalogue names and is never sent. Every module must be
sold at the one station, and a search takes at most one ship: asking for two is refused with “One
ship per search.”
Each module is sent as a group of its own in an array under modules, which the service requires
all of at one station. Probed on 2026-10-18 with Sol as the reference: 5A Frame Shift Drive (SCO)
with 0F Shutdown Field Neutraliser gave K3K-N8W at Barnard’s Star, a different answer from either
alone; a ship with two module groups required all three. ships with two values means either
ship, and ships as an array of groups is ignored, which is why a second ship is refused.
surface_stations false leaves out surface ports and settlements, and include_carriers is false
unless set. min_pad and max_station_distance are sent as in search_stations. The tool takes
no system filters. The answer is kept as the last outfitting search, in the search history, and can
be saved by name.
find_signal
Find the nearest signal of a kind, such as a Hazardous RES, a nav beacon or a memorial.
{"type":"object","properties":{"limit":{"type":"integer","description":"How many to return, 1 to 100. Default 25."},"max_distance":{"type":"number","description":"How far to look, in light years. Default 100."},"max_report_age_hours":{"type":"integer","description":"Leave out reports older than this many hours, 1 to 8,760. Absent or 0 means any age."},"near":{"type":"string","description":"Search out from this system. Defaults to theirs."},"signal":{"type":"string","description":"A kind, one of Any RES, Nav beacon, Compromised nav beacon, Resource extraction site, Low RES, High RES, Hazardous RES, Colonisation beacon, Tourist beacon, Installation, Megaship, Titan, Listening post, Unregistered comms beacon, Notable stellar phenomena; or any part of a signal\u0027s name such as \u0022unauthorised\u0022, \u0022memorial\u0022 or \u0022Natalie Fraser\u0022."}},"required":["signal"],"additionalProperties":false}
signal is a kind’s display name or “Any RES”, tried first, or any part of a signal’s name, such as
unauthorised, memorial or Natalie Fraser. The tool is not gated on Galaxy search: it answers on
this machine from the daily signal index, when the Signal index setting is on, and the
Commander’s own scans together. A signal held by both appears once, with the later date, and a
megaship appears once, where it was last seen.
near is placed from, in order: where the Commander is, when it is left out; a signal of the index
or of the Commander’s own scans in that system; Spansh, while Galaxy search is on. Otherwise the
search is refused, saying the system’s position is unknown. max_distance is in light years and
defaults to 100. max_report_age_hours (1 to 8,760) drops sightings last seen earlier than that many
hours ago, from the index and from the Commander’s own scans, before ranking; absent or 0 applies no bound,
and the answer says how far back it looked.
Each row of the answer gives the signal’s name, its system, the distance to two decimals, the date last seen, and whether it came from the index or the Commander’s own scan. The spoken answer names the nearest and how long ago it was seen. With the index off, the answer says only the Commander’s own scans were searched; before the journal backfill is done, it says those scans are still loading. A name search that finds nothing says that names are matched as they were uploaded, in the uploader’s game language. The answer is kept as the last signals search, in the search history, and can be saved by name.
distance_between
The straight-line distance in light years between two star systems.
{"type":"object","properties":{"from":{"type":"string","description":"The system to measure from. Defaults to theirs."},"to":{"type":"string","description":"The system to measure to."}},"required":["to"],"additionalProperties":false}
The arithmetic is d47’s own. The service returns positions and d47 computes the distance from the coordinates, so “how far” has the same answer wherever it is asked from.
describe_system
One star system as Spansh last had it, said in a few sentences, with its page opened on the panel.
{"type":"object","properties":{"system":{"type":"string","description":"The system to describe. Defaults to theirs."}},"required":[],"additionalProperties":false}
The answer gives the government, allegiance, primary economy, population, the controlling faction
and its state, the controlling power and its Powerplay state, the main star’s class, luminosity and whether it is scoopable, how many stations of each kind, and
the date of Spansh’s last report. With no system, it describes the system the Commander is in.
The panel opens Search › System on that system and stops following the Commander, as typing the name there does. Only a question the Commander asked moves the panel, and a surface holding a chooser stays where it is.
A name with no exact match answers with up to three close names and opens nothing; a misheard name is usually one of them. A system Spansh has no record of is said to be unknown and opens nothing.
When the system is in Elite’s list of visited systems for the Commander playing now, the answer ends with one more sentence: how many times they have been, and the day of the last visit. A system the list does not include adds nothing.
system_visits
Whether the Commander has been to a system, how many times, and the day of the last visit.
{"type":"object","properties":{"system":{"type":"string","description":"The system to check. Defaults to theirs."}},"required":[],"additionalProperties":false}
The answer comes from VisitedStarsCache.dat, which Elite writes for each Frontier account under
%LOCALAPPDATA%\Frontier Developments\Elite Dangerous\<account>, where <account> is the
journal’s FID without the F. d47 reads the file for the Commander playing now, reads it again
when the game rewrites it. Nothing from the file is sent anywhere.
public static string? PathFor(string folder, string? frontierId)
A system the file does not list is answered as no record of a visit, not as never visited. A file d47 cannot read, or one whose header does not match the layout it knows, is said to be unreadable rather than guessed at.
With no system, or the name of the system the Commander is in, it checks that system and works
with galaxy lookups off. Any other name has to be turned into a system address by Spansh, so with
lookups off d47 says it can only check the system the Commander is in.
get_bgs_tick
When the last BGS tick was. It reads the time held by BGS tick time and fetches nothing.
{"type":"object","properties":{},"required":[],"additionalProperties":false}
Asking “when was the last tick”, “when was the bgs tick” or “has the bgs ticked” is answered without a language model. The time is in-game time, which is UTC. With a time held, and then under the setting being off or nothing read yet:
"The last BGS tick was at 16:14 UTC on 15 October, 23 hours ago."
"BGS tick time is off, so I don't know when the tick was. It can be turned on under Outside sources."
"I haven't read the tick time yet."
Under an hour, the answer gives minutes instead of hours.
suggest_home_system
Suggest up to three systems the Commander could make their home, each with its reason and its two strongest careers. It takes no parameters. It reads the Commander’s claimed systems, pledged Power, stored squadron faction and career ratings, searches around their position, and ranks what it finds. It does not set the home system; the Commander asks for that after hearing the suggestion.
{"type":"object","properties":{},"required":[],"additionalProperties":false}
The answer names which case applied, in this order:
- Architect: the Commander has deployed a beacon in a system they claimed. Those systems replace every other candidate.
- Squadron and power: systems the squadron’s minor faction controls and strongholds of the pledged Power, those in both first.
- Squadron: systems the squadron’s minor faction controls.
- Power: strongholds of the pledged Power, and its capital.
- Interests: populated systems within 200 light years, chosen by the careers the Commander rates highest.
When the Commander is in a squadron with no stored minor faction, the answer says the squadron case was skipped so the model can ask for the faction.
"Suggesting a home system needs galaxy search, which is switched off. The Commander can turn it on in settings."
set_squadron_faction
Store the minor faction the Commander says their squadron backs, for the squadron they are in now. Only the Commander can set it; the model cannot.
{"type":"object","properties":{"faction":{"type":"string","description":"The minor faction\u0027s exact name, as the Commander said it."}},"required":["faction"],"additionalProperties":false}
Say “my squadron’s faction is Hutton Truckers”, “my squadron’s minor faction is Hutton Truckers” or “our squadron’s faction is Hutton Truckers”. No language model is involved. d47 asks Spansh whether a minor faction with that name exists, and stores it only if one does. It is kept for the Commander who is flying, under the squadron’s ID, or under its name when the journal gave no ID. Leaving the squadron or joining another one returns no faction until one is named for that squadron.
"Your squadron's minor faction is Hutton Truckers."
"I found no minor faction called Hutton Trukers, so I have not stored it."
"Checking a faction name needs galaxy search, which is switched off. The Commander can turn it on in settings."
find_nearest_station
Where to buy a named module or ship, nearest first. A rare good is answered from a table instead, since it has one selling station and no other.
{"type":"object","properties":{"commodity":{"type":"string","description":"A commodity traded there, by name."},"include_carriers":{"type":"boolean","description":"Also fleet carriers, whose prices are player-set and can move."},"large_pad":{"type":"boolean","description":"Only stations with a large landing pad."},"limit":{"type":"integer","description":"How many to return, 1 to 100. Default 25."},"max_distance":{"type":"number","description":"How far to look, in light years. Default 50."},"max_price_age_hours":{"type":"integer","description":"How stale a quoted price may be, in hours; 0 for any age. Default 720, one month for a commodity. For a module or ship, how old the station\u0027s report may be; no bound unless given."},"max_station_distance":{"type":"number","description":"Furthest from the star, in light seconds."},"min_supply":{"type":"integer","description":"Least in stock, or least demand when selling."},"module":{"type":"string","description":"A module to be sold there, by name \u2014 \u0022Frame Shift Drive\u0022."},"module_class":{"type":"string","description":"Module size, 0 to 8.","enum":["0","1","2","3","4","5","6","7","8"]},"module_rating":{"type":"string","description":"Module rating, A to I.","enum":["A","B","C","D","E","F","G","H","I"]},"near":{"type":"string","description":"Search out from this system. Defaults to theirs."},"order":{"type":"string","description":"asc or desc, over the whole answer rather than the rows shown. Default is nearest first for distance and best price first for price: desc for a seller, asc for a buyer.","enum":["asc","desc"]},"order_by":{"type":"string","description":"Nearest first, or best price first. Default price.","enum":["distance","price"]},"selling":{"type":"boolean","description":"Sell it rather than buy it."},"ship":{"type":"string","description":"A ship to be sold there, by name \u2014 \u0022Krait MkII\u0022."},"surface_stations":{"type":"boolean","description":"Also planetary ports and settlements. Default false."},"tag":{"type":"string","description":"Internal. Leave unset."},"tonnes":{"type":"integer","description":"How many tonnes, if they said."}},"required":[],"additionalProperties":false}
A rare good is answered from its one station, not from a sweep (#118). Each of the 142 rares is sold at exactly one station, which is usually far outside any radius worth searching, so asking the index for markets near you returns nothing useful. The station and system come from the shipped table, which needs no web access and answers with the galaxy search setting off. How much is on offer per visit is the one thing the table cannot hold — it is set by that station’s economic state and can be far higher during a boom — so it is read as the market’s own last report and given with its age. Where there is no report, or no web access to ask for one, the station is still named and the quantity is said to be unknown. The ship’s hold is no part of the answer: what the station is offering is the ceiling on a visit, and it is nearly always the smaller of the two. Asking where to sell a rare is a different question, and the ordinary radius sweep still runs for it.
Commodity prices come from a second host (#350). Everything else on this page is spansh; asking where to buy or sell one named commodity goes to Ardent Insight instead, which applies each EDDN message as it arrives. Measured on 2026-09-06 from Ega during a Community Goal rush, spansh’s station index carried the same stations at market figures one to two hours older and, for three of them, weeks older — so d47’s own freshness rule, working exactly as written, threw away stations INARA was showing with a two-minute-old quote, and the nearest station d47 named was one that had already been emptied. Nothing about the answer changed: same tool, same knobs, same page, same sentence, and the search says nothing about which host it asked.
If Ardent cannot be reached the search fails and says so. There is deliberately no quiet fall-back to spansh’s figures, because an answer that might have come from either source is one you have no way to read.
A station the feed leaves out is not added back from your own visits
(#350). Your Market.json still beats the feed’s
figure for a station the feed did return, whenever yours is newer — that is the station under
your feet and the one exact price d47 holds. But a station missing from a whole reply is one the
feed is saying no about, since the commodity, the supply floor, the radius and the age bound all
went into the request, and putting it back made d47 name a market that had been emptied hours
earlier. Where a reply comes back cut short it can speak for nothing it left out, so there your
visits still fill the gap — and a station that comes back that way has to clear the same floor,
radius, pad and age as everything else. The sweep behind route planning and a build’s sourcing is
paged rather than complete, and still folds your visits in as it always did.
order turns the ranking round. It is asc or desc over every station the market feed sent,
not the rows shown, so order_by: distance with order: desc names the farthest of them. Left out,
distance is nearest first and price is best first: cheapest for a buyer, highest for a seller. A
farthest-first answer does not go on the clipboard or become the system “set a course” takes.
The Distance and Price headers on the Route market page ask this way.
The four filters INARA’s commodity search has and this one lacked
(#296): max_station_distance in light seconds
from the star, min_supply as a floor a station must clear (demand when selling), surface_stations
to let planetary ports and settlements back in — they are out unless asked for, as INARA has it —
and order_by, which is price for the ranking this search has always had and distance for
nearest first. Only min_supply goes into the request, as the least a station must hold to be
answered for at all; the other three are applied here, off the arrival distance and station type
every result already carries. A station whose type or arrival distance the index does not know is
kept: unknown is not surface, and unknown is not far.
Nearest first changes what is said, not only the order. When the Commander orders by distance the nearest station is the answer, so the ear gets just enough of it to go — what was searched for, the winning station, its system, and the distance to it:
Nearest for buying Palladium, Platinum Reach (HR 6012), 53.3 ly. System is on your clipboard.
Price, stock, pad distance from the star and quote age used to be read out here too; they are still on the Navigation tab table, along with the rest of the ranking, and reading all of it out was detail the ear paid for and could not act on (#325). The price ordering still reads every station out, as it always did, and still names each one’s distance from the star wherever the index knows it, because a pad 60,000 light seconds out is the half of “how far” the Commander feels after the jump.
The winning system goes on the clipboard unconditionally, the same way plot_course puts one
there, so a nearest-first search is also the fastest way to get a system name into the galaxy map.
Saying “set a course” afterwards plots to it without the Commander repeating the name, and
“set a course and take us out” does the same and then leaves the pad — see
flight controls for both. Neither phrase has
anywhere to route with nothing found yet.
The saved Community Goal search — the INARA query with every one of these baked in — lives on the community goals page, and runs through this tool.
Every knob the commodity half has is an argument (#157).
It used not to be. max_distance was clamped to 250 inside the handler, so “expand your search
out to 500 light years” became 250 with nothing said, and the staleness bound was not a parameter
at all, so “expand your staleness filter” had no road from the sentence to the search. Both read
as an assistant ignoring an instruction when it was the schema that could not say yes.
So there is no ceiling on max_distance now. What bounds the radius is what the source honours
and how far the search actually reaches — and it says how far it got in its own words, which
is the truthful version of the sentence the cap was inventing. The market index does hold a horizon
of its own, measured at about 500 light years on 2026-09-06, but d47 does not write that number
down: the number it reports is read off the reply, so ask for 2,000 light years and the answer names
the distance the markets it got back really covered rather than claiming the radius.
And where the index cuts the reply short, the answer says the reach is unknown. It sends at most a thousand markets to a question, offers no second page, and — measured 2026-09-06 — does not cut by distance: widening one already-full search from 250 to 500 light years dropped 556 markets that were inside 250, the nearest of them 43 light years out with stock in it. So the furthest market that arrived measures the cut rather than the search, no distance is claimed at all, and what a best-of out of a cut list may be missing is nearer stock rather than further — which the answer says outright.
max_price_age_hours and include_carriers were both decisions taken in the handler and are now
the Commander’s to change:
carriers are still out by default, because their prices are player-set and the station itself may
be a hundred light years away by the time anybody arrives, but a carrier is sometimes the only
seller and INARA’s equivalent search includes them.
Two rules ride along with that, and they are the reason the knobs are safe to expose.
A question that was changed is said back. A search that swept five hundred light years and one that swept fifty read identically otherwise, which leaves a Commander no way to hear that their instruction landed — so a non-default radius, price age or carrier setting is echoed: “Searched out to 500 ly, prices up to 60 days old.” An unqualified search says nothing and reads exactly as it did before this existed.
A refused widening names its knob and its ceiling. max_price_age_hours stops at 8,760 — a
year — and 0 means any age; asking past the ceiling says so with the parameter’s own name attached
rather than narrowing the question in silence. “That’s as far as I search” is the sentence the change exists to delete.
And limit is under the same two rules (#178).
It was not, and it was worse than a clamp: a value outside 1 to 20 was reset to 5, so asking for
fifty returned five and the answer said nothing about either number. It now stops at 100 and starts
at 1, says so when it applies — “You asked for 50; limit stops at 100, so that is what I looked
for.” — and echoes a non-default count that was honoured, the way the radius is echoed. Both
halves of the tool obey it: the commodity search and the module-and-ship search take the same
argument and now owe the same sentence.
Module and ship names are not in the schema. There are 132 modules and 49 ships, and an
enum that large sits in prompt position 1 where one changed byte invalidates the whole cached
prefix — several kilobytes paid for on every turn to answer a question asked once a session. So
the parameter is free text and the name is matched against the real catalogue here, before a
request is built.
The matcher handles the two ways a spoken name arrives wrong. A fragment — “shield generator” for “Bi-Weave Shield Generator” — is what a Commander says. A misspelling — “Frame Shift Drve” — is what the transcriber does to them. Fragments are offered first.
This matters less than the system filters did and still matters. The service does honour a module name it has never heard of: it returns nothing. So a typo produces “nowhere within 100 light years sells that”, which is a false statement about the galaxy rather than a wrong filter. Catching it here turns it into “I don’t know a module called that; did you mean…”.
Stock is crowd-reported, so every result says when it was last seen. It is not what is there, it is what somebody last reported was there — and a live search on 2026-08-14 returned a carrier whose outfitting was last reported in October 2024 alongside two stations reported that morning. Reading the stale one out as current is how a Commander flies a long way for an empty shelf.
Getting a position out of a name takes one search: there is no lookup-by-name endpoint —
api/system/name/Colonia is a 404, and the by-id endpoint wants an id64 nobody says out loud —
so d47 names the system as a search reference and reads back the coordinates the service
resolved it to.
find_body
The nearest planets, moons and stars matching some criteria.
{"type":"object","properties":{"atmosphere":{"type":"string","description":"Atmosphere by name \u2014 \u0022Thin Ammonia\u0022, \u0022No atmosphere\u0022."},"body_type":{"type":"string","description":"The kind of body, by name \u2014 \u0022Earth-like world\u0022, \u0022Class I gas giant\u0022."},"codex_entry":{"type":"string","description":"A species or geological feature to find, by its codex name \u2014 \u0022Bacterium Cerbrus\u0022, \u0022Fumarole\u0022. A colour variant is searched as its species."},"gravity":{"type":"string","description":"Surface gravity in g: \u00220.5\u0022 is up to, \u00220.1-0.5\u0022 between."},"hotspot":{"type":"string","description":"A mining hotspot material in the body\u0027s rings \u2014 \u0022Painite\u0022, \u0022Void Opal\u0022."},"hotspot_count":{"type":"integer","description":"Exactly how many overlapping hotspots \u2014 not a minimum. A triple is 3."},"landable":{"type":"boolean","description":"Only bodies that can be landed on."},"limit":{"type":"integer","description":"How many to return, 1 to 100. Default 25."},"material":{"type":"string","description":"A raw surface material the body carries \u2014 \u0022Polonium\u0022."},"max_arrival_distance":{"type":"number","description":"Light seconds from the arrival star, at most."},"max_distance":{"type":"number","description":"How far to look, in light years. Default 50, at most 1,000."},"near":{"type":"string","description":"Search out from this system. Defaults to theirs."},"order":{"type":"string","description":"asc or desc. Default is the usual direction for order_by: desc for gravity, material, asc for the rest.","enum":["asc","desc"]},"order_by":{"type":"string","description":"What to sort by. Default distance, nearest first. \u0022material\u0022 keeps the richest in the material among the 50 nearest carrying it, and needs material.","enum":["distance","name","system","from_star","gravity","material"]},"power":{"type":"string","description":"The Powerplay power controlling the system.","enum":["A. Lavigny-Duval","Aisling Duval","Archon Delaine","Denton Patreus","Edmund Mahon","Felicia Winters","Jerome Archer","Li Yong-Rui","Nakato Kaine","Pranav Antal","Yuri Grom","Zemina Torval"]},"power_state":{"type":"string","description":"The system\u0027s Powerplay state.","enum":["Exploited","Fortified","Stronghold","Unoccupied"]},"reserve_level":{"type":"string","description":"How rich the rings are.","enum":["Common","Depleted","Low","Major","Pristine"]},"ring_type":{"type":"string","description":"Ring composition.","enum":["Icy","Metal Rich","Metallic","Rocky"]},"signal":{"type":"string","description":"A signal on the body\u0027s surface: \u0022Biological\u0022, \u0022Geological\u0022, \u0022Human\u0022, \u0022Guardian\u0022 or \u0022Thargoid\u0022."},"signal_count":{"type":"integer","description":"Exactly how many of that signal \u2014 not a minimum. Omit unless they asked for a number."},"temperature":{"type":"string","description":"Surface temperature in kelvin, as a range like gravity."},"terraformable":{"type":"boolean","description":"Only terraforming candidates, which are worth far more to map."},"tidally_locked":{"type":"boolean","description":"Only tidally locked bodies."},"volcanism":{"type":"string","description":"Volcanism by name \u2014 \u0022Water Geysers\u0022, \u0022Minor Rocky Magma\u0022."}},"required":[],"additionalProperties":false}
One index answers three questions that sound unrelated:
- where the nearest Earth-like world is — or neutron star, or water world, for a jump or a payday
- where there is something on a surface — biological and geological signals, and how many
- which ring to mine — a hotspot material, how many overlap, the ring’s composition and how rich its reserves are
Body types are matched, not listed. There are 61 of them, so the same reasoning applies as for module names — and the matcher takes a unique fragment as well as a spelling: “earth-like” names exactly one subtype and is what a person says. “gas giant” names six, so it is refused with the candidates rather than answered about whichever one came first.
Two things about this search were measured and are worth knowing before changing it.
The radius stops at 1,000 light years. Measured on 2026-10-23 from Sol, unfiltered: 3.5 s at
1,000 light years, 9.1 s at 1,001, 14.7 s at 5,000 and 39.5 s at 99,999 sorted farthest first, and
50.0 s at 99,999 nearest first. The body search budget is 15 s, so beyond about 5,000 light years
the search runs out of time. A ceiling of 1,000 keeps the answer under four seconds, and a
max_distance above it is searched at 1,000 and the answer ends “I searched 1,000 light years, the
furthest a body search goes.”
The signal filter has a third wire shape, different from both the system filters and the
station module group. It is {"name":{"value":["Biological"]},"count":2} — a choice member beside
a bare number. The obvious spelling, {"Biological":{"min":"1","max":"40"}}, is accepted and
ignored: within 20 light years of Sol it returned the unfiltered 1,315 bodies, exactly as a
misspelled key did.
A signal count is exact, not a minimum. Asking for 1 returned 41 bodies, 2 returned 14, 3 returned none and 4 returned 2 — not a decreasing series, and every result carried precisely the number asked for. So the schema says “exactly how many” rather than “at least”, because a “three or more” that silently meant “exactly three” would be a wrong answer that reads like a right one.
Gravity, temperature and arrival distance take the comparison shape. Like population,
each is ignored in the {"min","max"} shape and honoured as
{"value":["min","max"],"comparison":"<=>"}. Within 20 light years of Sol, against a control of
1,315 bodies, probed on 2026-10-03:
| Filter | Comparison shape | Min/max shape |
|---|---|---|
gravity 0–0.1 g |
362 | 1,147, not a filter |
surface_temperature 0–100 K |
797 | 1,315, ignored |
distance_to_arrival 0–10 Ls |
116 | 1,315, ignored |
max_arrival_distance is sent as distance_to_arrival from 0. gravity and temperature take
the same range syntax as the system filters: 0.5 is up to, 0.1-0.5 between.
volcanism and atmosphere are matched against the 22 and 78 values the service’s
field_values endpoints list, and sent in its spelling: “water geysers” is sent as
Water Geysers. A value that matches none is refused with the nearest names. tidally_locked
sends "true" or nothing, as landable does.
A material can be asked for, and ordered by share, but only among the nearest. material
is the same materials group find_material sends. The service carries each body’s share of
each material, but it ignores a share bound — Polonium with a bound of 90–100 returned the same 56
bodies as Polonium alone — and sorting by materials is an HTTP 400. So order_by: material
asks for the 50 nearest bodies carrying the material and keeps the limit with the highest share.
The richest is the richest among those 50, and the answer says so. It sorts highest first only;
order: asc is refused.
codex_entry finds the nearest bodies where the service records that species or geological feature, sent as landmark_subtype. The service records the species, not its colour variant, so “Frutexa Flammasis - Red” is searched as Frutexa Flammasis, and the answer says the species that was searched. A name the service has no record of matches nothing.
The answer names each body’s value for whatever was asked — the volcanism, the atmosphere, the
gravity, the temperature, tidally locked, and the material’s share. Every answer is kept as the
last bodies search, as for search_systems; a search that fails keeps nothing.
Hotspots carry the date they were reported, for the same reason outfitting stock does. They are crowd-sourced, and only the rings holding what you asked for are listed — a metal-rich ring with no Painite in it is not part of the answer to “where is Painite”, and naming it invites a trip to the wrong one of two rings around the same planet.
how_to_get
How anything is acquired — a ship, module, suit, hand weapon, modification, material, ship-locker item or commodity — asked as one question rather than three.
{"type":"object","properties":{"item":{"type":"string","description":"The thing to get, by name."},"near":{"type":"string","description":"Search out from this system. Defaults to theirs."}},"required":["item"],"additionalProperties":false}
Before this, the model chose among find_nearest_station, find_material and
find_micro_resource on its own, and a name that landed on the wrong one was redirected rather
than answered. how_to_get asks AcquisitionGuide instead, which already resolves a name against
every one of those catalogues, and answers in order: what the thing is, how it is acquired in
words, what has to be reached or held first, and any further detail the table carries.
For a Powerplay module, a sentence follows the pledge: the rank the Power unlocks it at, said against the Commander’s own rank and merits. A pledged Commander below the rank hears the shortfall, for example “Li Yong-Rui unlocks it at rank 34; you are rank 8, 201,708 merits short.”; the merits clause waits until the journal has reported them. At or past the rank it says so, and with a pledge but no rank reported yet it names the unlock rank alone. With no pledge it says “Every Power unlocks it; Li Yong-Rui soonest, at rank 34.” A pledge to a Power the rank table does not list adds nothing.
At most one search follows, the first of these that applies: a shipyard or outfitting search for a ship or module, with no distance limit, which names the nearest station at any distance and, when spansh reports 20 stations or fewer in the whole galaxy, adds “Only N stations are reported to sell it.” (or “No station is reported to sell it.” for none); a commodity market search for anything bought or sold by the tonne; a body search for something mined from a ring, with the material as the hotspot filter; a station search for the nearest material trader of the right kind. A rare good is answered from its one station in the table and searches nothing, and surface mining is said in words and searches nothing, since neither question the galaxy search answers is the one being asked. Every search is cut to the nearest one result — this tool asks where to go first, not for a ranked list.
With no web access, or a search that fails, the method is still the answer; only the “nearest” half is missing. A name nothing here recognises gets the nearest names instead of a guess.
find_mission_stations
The five stations likeliest to have one mission type on their boards, near a system.
{"type":"object","properties":{"max_distance":{"type":"number","description":"How far to look, in light years. Default 50, at most 500."},"mission_type":{"type":"string","description":"One mission type as spoken, such as disable or courier, or its internal name such as Mission_Disable."},"near":{"type":"string","description":"Search out from this system. Defaults to theirs."}},"required":["mission_type"],"additionalProperties":false}
No source publishes what a mission board holds, so this ranks stations by likelihood. The mission
type is resolved as get_mission_types resolves it, by family, spoken words or one exact internal
name, and the search uses the faction states its names were recorded under. A type with no states
uses its governments instead, and a type with neither searches with no faction filter. The filter
goes on minor_faction_presences, which matches every faction present in a system rather than only
the controlling one, because every faction present puts missions on the board:
"minor_faction_presences":[{"state":{"value":["Civil Unrest","Civil War","Expansion","Lockdown","Retreat","War"]}}]
The search returns the 30 nearest matching systems, each with its factions and stations, and the
ranking happens here. A station without Missions in its services is dropped, which drops every
fleet carrier. For an on-foot type, a station without Social Space is dropped as well, unless it
is a settlement. Each remaining station scores one for each faction present in a matching state,
one for each under a matching government, and one when the system’s primary economy matches. The
answer names the five highest scores, nearest first among equals, each with its system, distance
and how many factions there are in a matching state. When more systems matched than were returned,
it says how many it ranked over.
When some of the type’s names need a navy rank the Commander does not hold, the answer says so before the stations. A type whose every name comes from engineer bases searches nothing and names the three engineer bases nearest the Commander instead. Every answer says “likeliest”.
Notes for anyone reading the code
There is no published API for this service; the endpoints are reverse-engineered by every third party that uses them, and the shapes d47 relies on were established against the live service on 2026-08-14. Two that matter:
- a choice filter is
{"value":["Federation"]}— the bare string is a 400 - a range filter is
{"min":"0","max":"20"}, with the bounds as strings
search_reference in a response is a GUID identifying the search, not the system searched from.
The system’s name is reference.name. Reading the wrong one tells the Commander their distances
were measured from 4FF6E786-9829-11F1-A270-E7F8D53241C7.