Michael,
I'm the developer of the most popular (I think) admin tool for the Medal of Honor / Battlefield series of games, and before that did a significant amount of programming on the Microsoft FSX api. It would be good to have an API to the Elite : Dangerous 'series', but please note the following comments from first-hand experience:
* This thread is a wonderful crowd-sourced resource, but note the main content of it is 'information I'd like to get from an API' which is important but doesn't reflect the main issues in getting the fundamental capabilities of an API right.
* There is absolutely no way you will be able to have a single API for both client and system data, even if they are both presented via a local API on the client. So if you want to be successful you will need to design these as separate packages (and there is no need for them to be delivered simulataneously). Ultimately you might call it a single API (the Dangerous API) but in design it will have two parts architected differently.
* Microsoft FSX has a mature 'client aircraft status' api in
SimConnect. It does what it does ok (e.g. you can receive roll rate events) but it's only one api that does a particular thing, and is completely client-centric. However you can efficiently both receive real-time data and send control inputs as they thought carefully about that bit. The api does very little for 'world' information though (e.g. you can't directly ask "what elevation is a particular point on the map?") so that illustrates how an api can do one thing well but be unsuitable for other types of access.
* The Battlefield series has a mature 'server status' api see
BF4 PC Server Remote Administration Protocol.pdf. This is fundamentally driven by events spewing out of the server anyway, against which addon modules can respond, including with command inputs. So it's efficient, and actually in ascii so supports the lowest-common-denominator viewing in a console. It's really amateurish though.
* Work out what are the fundamental assets of the game (players, NPCs, ships, ship-types, stations, systems, station-types, weapons, weapon attributes, ammunition, commodities, commodity-types etc etc) and try and have reliable identifiers for them. There's nothing wrong with the api calling Beam Lasers "Beam Lasers" if that can be relied upon, but it is a total pain in the ass for add-on developers if you have identical "Green Beam Laser", "Blue Beam Laser" etc, or even worse the name changes in German.
* Do not, and I cannot emphasise this enough, make the API 'binary', i.e. functions and data as hexadecimal gobbledegook. I know the developers are from Cambridge, but in the real world of *free* addon module development there are very few of us core api programmers and a much larger population of slightly more hacky types who appreciate a Beam Laser being called a "BeamLaser" not a 0x4655363. I have a PhD in Computer Science from Cambridge but I do know the difference between theory and optimal industry practice. An example of why you'd do this is FD will inevitably add (e.g.) new weapons, and nearly ALL freeware addon modules just crash when they're presented with an unrecognised identifier. If you use binary you are radically increasing the chances of this happening, but if you use ascii the addon can say "you were shot with a MegaThrob" as a fallback for the addon failing to translate the new weapon key.
* Start with a limited and simple event API, user commands. Writing an efficient and robust api means seriously compromising the capabilities you provide. For example, I'd advise *against* implementing the version-1 of any api where the user can directly request data and then get it. E.g. "What system am I in" -> "Sol". You might not intend it but the majority of developers will end up polling this api, thinking it's ok because they chose a reasonably wide polling interval, but you end up with addons polling more and more frequently as the method is fundamentally flawed.
* it seems the most successful practical method for providing client status data is event driven, i.e. this is what both FSX and the Battlefield series uses. The addon registers a callback that receives suitable update events, like "you've just switched your lights on". It does not directly ask for immediate light status. As a tweak you *can* send the 'lights on' status (or off) when the client registers for the event, so the addon has a good initialisation.
* An addon needs an in-game way of communicating with the user, both user commands in and game status out. This does not prevent in any way the addon having its own Windows window, or indeed routing information to a completely separate machine, but for your average, typical, useful, simple addon you either tell the user something, they tell something to the addon, or both. The lowest-common-denominator for this (also the most common) is by hijacking the chat window. I.e. the game api already supports event-driven client status, and this includes "user has just chatted '!lights'", plus it has a command-capable api "turn lights on". This basically works, with negligible effort on the part of the game developers, but it isn't very elegant particularly in terms of *output*, i.e. the chatbox output is limited in terms of format. Might not sound fancy but the multi-billion-dollar Battlefield franchise would absolutely cease to function without the freeware addon in-game admin chat "!kick player" functionality.
* it is helpful to have public 'cross-reference' data that can be used in the addons (like a reference list of ships and weapons) but there's an issue that most addons have perpetually out-of-date reference data and don't handle that very well. Put your Cambridge boffins to think about that.
As an example of how the event driven market data api could be implemented:
(1) Game launches, addon automatically initialises
(2) Addon subscribes (e.g. registers callback) to the 'market update' event.
... time passes
(3) User docks in station, enters 'Commodities Market' screen
(4) 'market update' event fires, game calls addon (in a separate thread) passing it the current market data in some defined format.
(5) Addon sends chat message to user "Market data loaded"