diff --git a/EDSM/LogsApi.cs b/EDSM/LogsApi.cs
new file mode 100644
index 0000000..07cc8ab
--- /dev/null
+++ b/EDSM/LogsApi.cs
@@ -0,0 +1,154 @@
+//
+// Copyright 2021–2022 alterNERDtive.
+//
+// This file is part of EDNA.
+//
+// EDNA is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// EDNA is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with EDNA. If not, see <https://www.gnu.org/licenses/>.
+//
+
+using System;
+using System.Threading.Tasks;
+using RestSharp;
+
+namespace Edsm
+{
+ ///
+ /// A Commander in the galaxy of Elite Dangerous, as returned from EDSM’s
+ /// “Logs” API.
+ ///
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1649:File name should match first type name", Justification = "Either this or wrong class/struct order 🤷")]
+ public struct ApiCmdr
+ {
+ ///
+ /// Gets or sets EDSM’s internal message code for the request; see
+ /// https://www.edsm.net/en/api-logs-v1 for details.
+ ///
+ public int MsgNum { get; set; }
+
+ ///
+ /// Gets or sets the API’s status message; see
+ /// https://www.edsm.net/en/api-logs-v1 for details.
+ ///
+ public string Message { get; set; }
+
+ ///
+ /// Gets or sets the commander’s current system. Will be “null” if the
+ /// commander’s flight log is hidden.
+ ///
+ public string System { get; set; }
+
+ ///
+ /// Gets or sets whether the commander has first discovered their
+ /// current system.
+ ///
+ public bool? FirstDiscover { get; set; }
+
+ ///
+ /// Gets or sets the date and time of the commander’s jump into the
+ /// current system. Will be null if the commander’s flight log
+ /// timestamps are hidden.
+ ///
+ public DateTime? Date { get; set; }
+
+ ///
+ /// Gets or sets EDSM’s internal ID of the commander’s current system.
+ ///
+ public ulong? SystemId { get; set; }
+
+ ///
+ /// Gets or sets the ID64 of the commander’s current system.
+ ///
+ public ulong? SystemId64 { get; set; }
+
+ ///
+ /// Gets or sets the coordinates of the commander’s current system. Will
+ /// be null if the commander’s flight log is hidden.
+ ///
+ public Coordinates? Coordinates { get; set; }
+
+ ///
+ /// Gets or sets whether the commander is currently docked to a station.
+ ///
+ public bool? IsDocked { get; set; }
+
+ ///
+ /// Gets or sets the station the commander is currently docked at.
+ ///
+ public string Station { get; set; }
+
+ ///
+ /// Gets or sets EDSM’s internal ID of the station the commander is
+ /// currently docked at.
+ ///
+ public int? StationId { get; set; }
+
+ ///
+ /// Gets or sets the date time of docking at the commander’s currently
+ /// docked station.
+ ///
+ public DateTime? DateDocked { get; set; }
+
+ ///
+ /// Gets or sets the ship ID of the commander’s current ship. That is
+ /// the slot ID of the ship, not the “ID” chosen in livery.
+ ///
+ public int? ShipId { get; set; }
+
+ ///
+ /// Gets or sets the ship type of the commander’s current ship.
+ ///
+ public string ShipType { get; set; }
+
+ ///
+ /// Gets or sets the fuel status of the commander’s current ship. Seems
+ /// to always be “null”.
+ ///
+ public object ShipFuel { get; set; }
+
+ ///
+ /// Gets or sets the date and time of the commander’s last recorded
+ /// activity. Will be “null” if the commander’s flight log is hidden.
+ ///
+ public DateTime? DateLastActivity { get; set; }
+
+ ///
+ /// Gets or sets the commander’s EDSM profile URL. Will be “null” if the
+ /// commander’s profile page is hidden.
+ ///
+ public string Url { get; set; }
+ }
+
+ public class LogsApi
+ {
+ private static readonly Uri ApiUrl = new Uri("https://www.edsm.net/api-logs-v1");
+ private static readonly RestClient ApiClient = new RestClient(ApiUrl);
+
+ public static async Task FindCmdr(string name, string? apiKey = null)
+ {
+ RestRequest request = new RestRequest("get-position")
+ .AddQueryParameter("commanderName", name)
+ .AddQueryParameter("showID", 1)
+ .AddQueryParameter("showCoordinates", 1);
+
+ if (apiKey != null)
+ {
+ request.AddQueryParameter("apiKey", apiKey);
+ }
+
+ ApiCmdr response = await ApiClient.GetAsync(request);
+
+ return response;
+ }
+ }
+}