Direction 1: your server pushes allowed emails into ProLogbooks
Warning about monthly connector-user fees
Be careful when you add or keep allowed connector users. The system creates one monthly invoice item based on the number of allowed connector users that stayed registered for more than 2 days. It bills the active monthly connector-user unit price multiplied by that qualified user count for the billing month, so each extra allowed user can increase the monthly charge even before that person starts syncing flights.
Your server can create or refresh allowed connector users by calling the bearer-token endpoint `/api/v1/connectors/import-emails.php`. This is the actual repo endpoint meant for the partner system. It is not the same as the internal browser endpoint `/api/partner-connector-users.php`, which requires a signed-in session and CSRF token.
Use this call whenever your company onboarding process adds or removes people who should be allowed to sync through the connector. ProLogbooks deduplicates emails, skips invalid ones, and returns the stable per-user access token you must save on your side.
After the call succeeds, read the `imported_emails` array in the response and store each returned `access_token` in your partner database beside the matching user email or partner user record. Treat this value as that user’s ProLogbooks user API key. Later, when ProLogbooks checks, previews, or syncs data for that allowed user, it sends the same email and `access_token` to your partner endpoint. Your server should use that pair to recognize which partner-side user the request is about and to decide whether the sync is still allowed.
curl -X POST https://prologbooks.com/api/v1/connectors/import-emails.php \
-H "Authorization: Bearer YOUR_CONNECTOR_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
--data '{
"emails": [
"pilot.one@example.com",
"pilot.two@example.com",
{
"email": "pilot.three@example.com"
}
],
"remove_emails": [
"former.pilot@example.com"
]
}'
import requests
endpoint = "https://prologbooks.com/api/v1/connectors/import-emails.php"
api_key = "YOUR_CONNECTOR_API_KEY"
payload = {
"emails": [
"pilot.one@example.com",
"pilot.two@example.com",
{"email": "pilot.three@example.com"},
],
"remove_emails": [
"former.pilot@example.com",
],
}
response = requests.post(
endpoint,
headers={
"Authorization": f"Bearer {api_key}",
"Accept": "application/json",
"Content-Type": "application/json",
},
json=payload,
timeout=20,
)
print(response.status_code)
print(response.text)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class ImportConnectorEmails
{
public static void main(String[] args) throws Exception
{
String endpoint = "https://prologbooks.com/api/v1/connectors/import-emails.php";
String apiKey = "YOUR_CONNECTOR_API_KEY";
String payload = """
{
"emails": [
"pilot.one@example.com",
"pilot.two@example.com",
{ "email": "pilot.three@example.com" }
],
"remove_emails": [
"former.pilot@example.com"
]
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(endpoint))
.header("Authorization", "Bearer " + apiKey)
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}
const endpoint = "https://prologbooks.com/api/v1/connectors/import-emails.php";
const apiKey = "YOUR_CONNECTOR_API_KEY";
const payload = {
emails: [
"pilot.one@example.com",
"pilot.two@example.com",
{ email: "pilot.three@example.com" },
],
remove_emails: [
"former.pilot@example.com",
],
};
const response = await fetch(endpoint, {
method: "POST",
headers: {
Authorization: `Bearer ${apiKey}`,
Accept: "application/json",
"Content-Type": "application/json",
},
body: JSON.stringify(payload),
});
console.log(response.status);
console.log(await response.text());
using System.Net.Http.Headers;
using System.Text;
var endpoint = "https://prologbooks.com/api/v1/connectors/import-emails.php";
var apiKey = "YOUR_CONNECTOR_API_KEY";
var payload = """
{
"emails": [
"pilot.one@example.com",
"pilot.two@example.com",
{ "email": "pilot.three@example.com" }
],
"remove_emails": [
"former.pilot@example.com"
]
}
""";
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Post, endpoint);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
request.Content = new StringContent(payload, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine((int) response.StatusCode);
Console.WriteLine(responseBody);
<?php
declare(strict_types=1);
$endpoint = 'https://prologbooks.com/api/v1/connectors/import-emails.php';
$apiKey = 'YOUR_CONNECTOR_API_KEY';
$payload = json_encode([
'emails' => [
'pilot.one@example.com',
'pilot.two@example.com',
['email' => 'pilot.three@example.com'],
],
'remove_emails' => [
'former.pilot@example.com',
],
], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
$ch = curl_init($endpoint);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Accept: application/json',
'Content-Type: application/json',
'Content-Length: ' . strlen((string) $payload),
],
CURLOPT_POSTFIELDS => $payload,
CURLOPT_TIMEOUT => 20,
]);
$responseBody = curl_exec($ch);
$responseCode = (int) curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
$curlError = curl_error($ch);
curl_close($ch);
if ($responseBody === false) {
throw new RuntimeException('Request failed: ' . $curlError);
}
echo "HTTP {$responseCode}\n";
echo $responseBody . "\n";
{
"emails": [
"pilot.one@example.com",
"pilot.two@example.com",
{
"email": "pilot.three@example.com"
}
],
"remove_emails": [
"former.pilot@example.com"
]
}
{
"message": "Connector email list imported.",
"connector": {
"key": "partner_connector_user_42",
"id": 7,
"name": "Partner connector",
"access_plan": 9999
},
"summary": {
"received_import": 3,
"received_remove": 1,
"accepted_import": 3,
"accepted_remove": 1,
"inserted": 2,
"updated": 1,
"deleted": 1,
"invalid": 0
},
"imported_emails": [
{
"email": "pilot.one@example.com",
"access_token": "0f7f9d926f94a91c0bf4d2a8a34ebd799753a4a4d2fd2b380c53a72b0d5db04b",
"status": "inserted"
},
{
"email": "pilot.two@example.com",
"access_token": "84a64eb5487d27af25fa917f5227d01782aaebc88ad45129d7658bd6cfaf5283",
"status": "updated"
}
],
"invalid_emails": []
}
- `emails` adds or refreshes allowed users for this connector.
- `remove_emails` removes access for this connector only.
- `imported_emails[].access_token` is the per-user API key your server must store in its database and later match against ProLogbooks requests.
- When ProLogbooks later calls your endpoints, match the incoming `email` and `access_token` to the stored partner user before returning data.
Direction 2: ProLogbooks calls your check endpoint
When a signed-in user presses Check on a connector-linked logbook, ProLogbooks sends a server-to-server `POST` to the URL saved in `endpoint_checkuser`. The repo sends the connector API key as bearer authentication and a JSON payload containing the user email plus the stable per-user access token.
Your endpoint should treat this as an allow or deny call. Return `{ "ok": true }` only when the email and access token match a real partner-side user that is still allowed to use this connector. On failure, return JSON with an `error` string that is safe for end users to see.
{
"email": "pilot@example.com",
"access_token": "stable-token-generated-by-prologbooks"
}
{
"ok": true
}
{
"error": "User not found in connector."
}
curl -X POST https://partner.example.com/connector/checkuser.php \
-H "Authorization: Bearer YOUR_CONNECTOR_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
--data '{
"email": "pilot@example.com",
"access_token": "stable-token-generated-by-prologbooks"
}'
import requests
endpoint = "https://partner.example.com/connector/checkuser.php"
api_key = "YOUR_CONNECTOR_API_KEY"
payload = {
"email": "pilot@example.com",
"access_token": "stable-token-generated-by-prologbooks",
}
response = requests.post(
endpoint,
headers={
"Authorization": f"Bearer {api_key}",
"Accept": "application/json",
"Content-Type": "application/json",
},
json=payload,
timeout=12,
)
print(response.status_code)
print(response.text)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class CheckConnectorUser
{
public static void main(String[] args) throws Exception
{
String endpoint = "https://partner.example.com/connector/checkuser.php";
String apiKey = "YOUR_CONNECTOR_API_KEY";
String payload = """
{
"email": "pilot@example.com",
"access_token": "stable-token-generated-by-prologbooks"
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(endpoint))
.header("Authorization", "Bearer " + apiKey)
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}
const endpoint = "https://partner.example.com/connector/checkuser.php";
const apiKey = "YOUR_CONNECTOR_API_KEY";
const payload = {
email: "pilot@example.com",
access_token: "stable-token-generated-by-prologbooks",
};
const response = await fetch(endpoint, {
method: "POST",
headers: {
Authorization: `Bearer ${apiKey}`,
Accept: "application/json",
"Content-Type": "application/json",
},
body: JSON.stringify(payload),
});
console.log(response.status);
console.log(await response.text());
using System.Net.Http.Headers;
using System.Text;
var endpoint = "https://partner.example.com/connector/checkuser.php";
var apiKey = "YOUR_CONNECTOR_API_KEY";
var payload = """
{
"email": "pilot@example.com",
"access_token": "stable-token-generated-by-prologbooks"
}
""";
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Post, endpoint);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
request.Content = new StringContent(payload, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine((int) response.StatusCode);
Console.WriteLine(responseBody);
<?php
declare(strict_types=1);
$endpoint = 'https://partner.example.com/connector/checkuser.php';
$apiKey = 'YOUR_CONNECTOR_API_KEY';
$payload = json_encode([
'email' => 'pilot@example.com',
'access_token' => 'stable-token-generated-by-prologbooks',
], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
$ch = curl_init($endpoint);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Accept: application/json',
'Content-Type: application/json',
'Content-Length: ' . strlen((string) $payload),
],
CURLOPT_POSTFIELDS => $payload,
CURLOPT_TIMEOUT => 12,
]);
$responseBody = curl_exec($ch);
$responseCode = (int) curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
$curlError = curl_error($ch);
curl_close($ch);
if ($responseBody === false) {
throw new RuntimeException('Request failed: ' . $curlError);
}
echo "HTTP {$responseCode}\n";
echo $responseBody . "\n";
Direction 3: ProLogbooks calls your preview or sync endpoint
When the user opens preview, asks for pending connector flights, or runs sync, ProLogbooks calls the URL saved in `endpoint_getnewids`. The repo uses the same bearer connector API key, but the payload is larger because it includes the user token, the partner item IDs already known by the logbook, and the list of writable flight columns the current repo understands.
The `syncable_flight_columns` array in the request payload is the transfer contract for the current installation. It includes the complete set of flight columns ProLogbooks can accept from the preview or sync response, including `flight_number`, route fields, UTC/timezone fields, time allocation fields, remarks, review status fields, and `block_time_role`.
Send only fields your server knows. Unknown extra fields are ignored, but required flight fields such as date, departure, arrival, times, and positive block minutes must be valid or the individual item will be skipped. If you send `block_time_role` for Flight Crew, use `PIC`, `SIC`, `STUD`, or `INST`. For Cabin Crew, use `FA`, `PUR`, `LFA`, `CA`, `TRA`, or `INST`. The Cabin Crew role is saved as a static label only and does not allocate pilot minute columns.
{
"email": "pilot@example.com",
"access_token": "stable-token-generated-by-prologbooks",
"synced_partner_item_uids": [
"flight-10001",
"flight-10002"
],
"syncable_flight_columns": [
"flight_date",
"aircraft_type",
"flight_number",
"aircraft_registration",
"pic_name",
"copilot_name",
"departure_airport",
"departure_lat",
"departure_long",
"departure_time",
"departure_utc",
"departure_timezone",
"arrival_airport",
"arrival_lat",
"arrival_long",
"arrival_time",
"arrival_utc",
"arrival_timezone",
"route_via",
"block_time_minutes",
"block_time_role",
"day_minutes",
"pic_time_minutes",
"sic_time_minutes",
"night_minutes",
"ifr_minutes",
"ifr_actual_minutes",
"ifr_hood_minutes",
"ifr_simulated_minutes",
"simulator_minutes",
"ground_trainer_minutes",
"single_pilot_se_minutes",
"single_pilot_me_minutes",
"multi_pilot_time_minutes",
"dual_received_minutes",
"instruction_given_minutes",
"flight_rules",
"fstd_date",
"fstd_type",
"single_engine_day_dual_minutes",
"single_engine_day_pic_minutes",
"single_engine_day_copilot_minutes",
"single_engine_night_dual_minutes",
"single_engine_night_pic_minutes",
"single_engine_night_copilot_minutes",
"multi_engine_day_dual_minutes",
"multi_engine_day_pic_minutes",
"multi_engine_day_copilot_minutes",
"multi_engine_night_dual_minutes",
"multi_engine_night_pic_minutes",
"multi_engine_night_copilot_minutes",
"cross_country_day_dual_minutes",
"cross_country_day_pic_minutes",
"cross_country_day_copilot_minutes",
"cross_country_night_dual_minutes",
"cross_country_night_pic_minutes",
"cross_country_night_copilot_minutes",
"faa_cross_country_minutes",
"instrument_approaches_count",
"approach_types",
"takeoffs_day",
"landings_day",
"takeoffs_night",
"landings_night",
"floats_minutes",
"tailwheel_minutes",
"helicopter_minutes",
"turbine_minutes",
"glass_cockpit_minutes",
"remarks",
"private_remarks",
"import_status",
"timezone_status",
"timezone_notes",
"reviewed_by_user_id",
"reviewed_at"
]
}
{
"items": [
{
"partner_item_uid": "flight-10003",
"flight_date": "2026-05-01",
"flight_number": "AC123",
"aircraft_type": "C172",
"aircraft_registration": "C-GABC",
"pic_name": "Jane Pilot",
"departure_airport": "CYTZ",
"departure_lat": 43.628611,
"departure_long": -79.396667,
"departure_time": "09:10",
"arrival_airport": "CYOO",
"arrival_lat": 43.922778,
"arrival_long": -78.895,
"arrival_time": "10:35",
"block_time_minutes": 85,
"block_time_role": "PIC",
"pic_time_minutes": 85,
"single_pilot_se_minutes": 85,
"takeoffs_day": 1,
"landings_day": 1,
"remarks": "Training flight"
}
]
}
curl -X POST https://partner.example.com/connector/getnewids.php \
-H "Authorization: Bearer YOUR_CONNECTOR_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
--data '{
"email": "pilot@example.com",
"access_token": "stable-token-generated-by-prologbooks",
"synced_partner_item_uids": [
"flight-10001",
"flight-10002"
],
"syncable_flight_columns": [
"flight_date",
"aircraft_type",
"flight_number",
"aircraft_registration",
"departure_airport",
"departure_time",
"arrival_airport",
"arrival_time",
"block_time_minutes",
"remarks"
]
}'
import requests
endpoint = "https://partner.example.com/connector/getnewids.php"
api_key = "YOUR_CONNECTOR_API_KEY"
payload = {
"email": "pilot@example.com",
"access_token": "stable-token-generated-by-prologbooks",
"synced_partner_item_uids": [
"flight-10001",
"flight-10002",
],
"syncable_flight_columns": [
"flight_date",
"aircraft_type",
"flight_number",
"aircraft_registration",
"departure_airport",
"departure_time",
"arrival_airport",
"arrival_time",
"block_time_minutes",
"remarks",
],
}
response = requests.post(
endpoint,
headers={
"Authorization": f"Bearer {api_key}",
"Accept": "application/json",
"Content-Type": "application/json",
},
json=payload,
timeout=20,
)
print(response.status_code)
print(response.text)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class GetNewConnectorFlights
{
public static void main(String[] args) throws Exception
{
String endpoint = "https://partner.example.com/connector/getnewids.php";
String apiKey = "YOUR_CONNECTOR_API_KEY";
String payload = """
{
"email": "pilot@example.com",
"access_token": "stable-token-generated-by-prologbooks",
"synced_partner_item_uids": [
"flight-10001",
"flight-10002"
],
"syncable_flight_columns": [
"flight_date",
"aircraft_type",
"flight_number",
"aircraft_registration",
"departure_airport",
"departure_time",
"arrival_airport",
"arrival_time",
"block_time_minutes",
"remarks"
]
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(endpoint))
.header("Authorization", "Bearer " + apiKey)
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}
const endpoint = "https://partner.example.com/connector/getnewids.php";
const apiKey = "YOUR_CONNECTOR_API_KEY";
const payload = {
email: "pilot@example.com",
access_token: "stable-token-generated-by-prologbooks",
synced_partner_item_uids: [
"flight-10001",
"flight-10002",
],
syncable_flight_columns: [
"flight_date",
"aircraft_type",
"flight_number",
"aircraft_registration",
"departure_airport",
"departure_time",
"arrival_airport",
"arrival_time",
"block_time_minutes",
"remarks",
],
};
const response = await fetch(endpoint, {
method: "POST",
headers: {
Authorization: `Bearer ${apiKey}`,
Accept: "application/json",
"Content-Type": "application/json",
},
body: JSON.stringify(payload),
});
console.log(response.status);
console.log(await response.text());
using System.Net.Http.Headers;
using System.Text;
var endpoint = "https://partner.example.com/connector/getnewids.php";
var apiKey = "YOUR_CONNECTOR_API_KEY";
var payload = """
{
"email": "pilot@example.com",
"access_token": "stable-token-generated-by-prologbooks",
"synced_partner_item_uids": [
"flight-10001",
"flight-10002"
],
"syncable_flight_columns": [
"flight_date",
"aircraft_type",
"flight_number",
"aircraft_registration",
"departure_airport",
"departure_time",
"arrival_airport",
"arrival_time",
"block_time_minutes",
"remarks"
]
}
""";
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Post, endpoint);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
request.Content = new StringContent(payload, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine((int) response.StatusCode);
Console.WriteLine(responseBody);
<?php
declare(strict_types=1);
$endpoint = 'https://partner.example.com/connector/getnewids.php';
$apiKey = 'YOUR_CONNECTOR_API_KEY';
$payload = json_encode([
'email' => 'pilot@example.com',
'access_token' => 'stable-token-generated-by-prologbooks',
'synced_partner_item_uids' => [
'flight-10001',
'flight-10002',
],
'syncable_flight_columns' => [
'flight_date',
'aircraft_type',
'flight_number',
'aircraft_registration',
'departure_airport',
'departure_time',
'arrival_airport',
'arrival_time',
'block_time_minutes',
'remarks',
],
], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
$ch = curl_init($endpoint);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Accept: application/json',
'Content-Type: application/json',
'Content-Length: ' . strlen((string) $payload),
],
CURLOPT_POSTFIELDS => $payload,
CURLOPT_TIMEOUT => 20,
]);
$responseBody = curl_exec($ch);
$responseCode = (int) curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
$curlError = curl_error($ch);
curl_close($ch);
if ($responseBody === false) {
throw new RuntimeException('Request failed: ' . $curlError);
}
echo "HTTP {$responseCode}\n";
echo $responseBody . "\n";
Important response shape
-
Important
Return JSON only
The response must be JSON only. ProLogbooks accepts either an object with an `items` array or a top-level array. Every returned flight item needs one stable unique identifier under `partner_item_uid`, `partner_item_id`, or `unique_id`.
Reference the available import fields
The column-mapping list can propose the destination fields below. The field key is the internal value used by the importer, and the label is what you see in the mapping dropdown.
The table includes a column for each logbook type: Flight crew, Cabin crew, and Drone pilot. Fields that do not apply to a given type show as not applicable in that column.
Map the required fields first, then add the optional time, route, approach, landing, or specialty fields only when your source file contains reliable values for them.
| Field key | Mapping label | Flight crew | Cabin crew | Drone pilot |
|---|---|---|---|---|
flight_date |
Flight date | Stores the flight date for the imported row. | Stores the work date or sector date for the Cabin Crew entry. | Stores the mission date. |
flight_number |
Flight number | Stores the carrier flight number when it is available. | Stores the carrier flight number when it is available. | Optional. Use it to record a job reference, work order number, or operational identifier. |
aircraft_type |
Aircraft type | Stores the aircraft type or model used for the flight. | Optional for Cabin Crew; use it only when the aircraft type is useful to keep. | Stores the drone model or UAS type name. |
aircraft_registration |
Aircraft registration | Stores the aircraft registration used for the flight. | Optional for Cabin Crew; use it only when the registration or identifier is useful to keep. | Stores the drone registration number, serial number, or identifier. |
pic_name |
Pilot-in-command name | Stores the pilot-in-command name for the flight. | Stores the captain name when known. | Stores the remote pilot in command (RPIC) name. |
copilot_name |
Co-pilot / student / passenger | Stores the co-pilot, student, or passenger name for the flight. | Stores the purser, lead, or crew names when useful. | Optional. Stores the visual observer (VO) or second crew member name when present. |
departure_airport |
Departure airport | Stores the airport code or ident used for Departure airport. | Stores the airport code or ident used for Departure airport. | Stores the Departure airport name or identifier. Use a recognisable location name when no formal code applies. |
departure_lat |
Departure latitude | Stores the decimal latitude used for Departure latitude. | Departure latitude is optional for Cabin Crew imports unless your workflow uses it. | Stores the decimal latitude of the Departure latitude. |
departure_long |
Departure longitude | Stores the decimal longitude used for Departure longitude. | Departure longitude is optional for Cabin Crew imports unless your workflow uses it. | Stores the decimal longitude of the Departure longitude. |
departure_time |
Departure time | Stores the local clock time used for Departure time in HH:MM format. | Stores the local clock time used for Departure time in HH:MM format. | Stores the Departure time in HH:MM format. |
departure_utc |
Departure UTC time | Stores the UTC date and time used for Departure UTC time. | Departure UTC time is optional for Cabin Crew imports unless your workflow uses it. | Stores the UTC date and time of the Departure UTC time. |
departure_timezone |
Departure timezone | Stores the IANA timezone name used for Departure timezone. | Departure timezone is optional for Cabin Crew imports unless your workflow uses it. | Stores the IANA timezone name for the Departure timezone. |
arrival_airport |
Arrival airport | Stores the airport code or ident used for Arrival airport. | Stores the airport code or ident used for Arrival airport. | Stores the Arrival airport name or identifier. Use a recognisable location name when no formal code applies. |
arrival_lat |
Arrival latitude | Stores the decimal latitude used for Arrival latitude. | Arrival latitude is optional for Cabin Crew imports unless your workflow uses it. | Stores the decimal latitude of the Arrival latitude. |
arrival_long |
Arrival longitude | Stores the decimal longitude used for Arrival longitude. | Arrival longitude is optional for Cabin Crew imports unless your workflow uses it. | Stores the decimal longitude of the Arrival longitude. |
arrival_time |
Arrival time | Stores the local clock time used for Arrival time in HH:MM format. | Stores the local clock time used for Arrival time in HH:MM format. | Stores the Arrival time in HH:MM format. |
arrival_utc |
Arrival UTC time | Stores the UTC date and time used for Arrival UTC time. | Arrival UTC time is optional for Cabin Crew imports unless your workflow uses it. | Stores the UTC date and time of the Arrival UTC time. |
arrival_timezone |
Arrival timezone | Stores the IANA timezone name used for Arrival timezone. | Arrival timezone is optional for Cabin Crew imports unless your workflow uses it. | Stores the IANA timezone name for the Arrival timezone. |
route_via |
Route / via | Stores the intermediate route, via points, or routing notes for the flight. | Stores route, pairing, sector, or duty notes. | Optional. Stores airspace zone, flight area, patrol corridor, or operational routing notes. |
block_time_minutes |
Total flight time | Stores the duration credited to Total flight time. | Stores the duration credited to Total flight time when you intentionally import that value. | Stores the total mission time in minutes. This is the primary time value for drone logbook entries. |
block_time_role |
Flight time role | Stores the value used for Flight time role. | Use FA, PUR, LFA, CA, TRA, or INST. This value is recorded as a role label and does not allocate pilot time columns. | Not used for drone missions. |
day_minutes |
Day | Stores the duration credited to Day. | Stores the duration credited to Day when you intentionally import that value. | Not used for drone missions. |
pic_time_minutes |
PIC | Stores the duration credited to PIC. | Stores the duration credited to PIC when you intentionally import that value. | Not used for drone missions. |
sic_time_minutes |
Co-Pilot | Stores the duration credited to Co-Pilot. | Stores the duration credited to Co-Pilot when you intentionally import that value. | Not used for drone missions. |
night_minutes |
Night | Stores the duration credited to Night. | Stores the duration credited to Night when you intentionally import that value. | Not used for drone missions. |
ifr_minutes |
Ifr | Stores the duration credited to Ifr. | Stores the duration credited to Ifr when you intentionally import that value. | Not used for drone missions. |
ifr_actual_minutes |
IFR Actual | Stores the duration credited to IFR Actual. | Stores the duration credited to IFR Actual when you intentionally import that value. | Not used for drone missions. |
ifr_hood_minutes |
IFR Hood | Stores the duration credited to IFR Hood. | Stores the duration credited to IFR Hood when you intentionally import that value. | Not used for drone missions. |
ifr_simulated_minutes |
Sim. Instr. | Stores the duration credited to Sim. Instr.. | Stores the duration credited to Sim. Instr. when you intentionally import that value. | Not used for drone missions. |
simulator_minutes |
FSTD Time | Stores the duration credited to FSTD Time. | Stores the duration credited to FSTD Time when you intentionally import that value. | Not used for drone missions. |
ground_trainer_minutes |
Ground Trainer | Stores the duration credited to Ground Trainer. | Stores the duration credited to Ground Trainer when you intentionally import that value. | Not used for drone missions. |
single_pilot_se_minutes |
SP SE | Stores the duration credited to SP SE. | Stores the duration credited to SP SE when you intentionally import that value. | Not used for drone missions. |
single_pilot_me_minutes |
SP ME | Stores the duration credited to SP ME. | Stores the duration credited to SP ME when you intentionally import that value. | Not used for drone missions. |
multi_pilot_time_minutes |
MP | Stores the duration credited to MP. | Stores the duration credited to MP when you intentionally import that value. | Not used for drone missions. |
dual_received_minutes |
Dual | Stores the duration credited to Dual. | Stores the duration credited to Dual when you intentionally import that value. | Not used for drone missions. |
instruction_given_minutes |
FI | Stores the duration credited to FI. | Stores the duration credited to FI when you intentionally import that value. | Not used for drone missions. |
flight_rules |
Rules | Stores the flight rules value, such as VFR or IFR, for the row. | Rules is optional for Cabin Crew imports unless your workflow uses it. | Not used for drone missions. |
fstd_date |
Fstd Date | Stores the simulator or FSTD session date when that session is imported separately from the flight date. | Fstd Date is optional for Cabin Crew imports unless your workflow uses it. | Not used for drone missions. |
fstd_type |
FSTD Type | Stores the simulator, FSTD, or training device type linked to the row. | FSTD Type is optional for Cabin Crew imports unless your workflow uses it. | Not used for drone missions. |
single_engine_day_dual_minutes |
SE Day Dual | Stores the duration credited to SE Day Dual. | Stores the duration credited to SE Day Dual when you intentionally import that value. | Not used for drone missions. |
single_engine_day_pic_minutes |
SE Day PIC | Stores the duration credited to SE Day PIC. | Stores the duration credited to SE Day PIC when you intentionally import that value. | Not used for drone missions. |
single_engine_day_copilot_minutes |
SE Day Co-Pilot | Stores the duration credited to SE Day Co-Pilot. | Stores the duration credited to SE Day Co-Pilot when you intentionally import that value. | Not used for drone missions. |
single_engine_night_dual_minutes |
SE Night Dual | Stores the duration credited to SE Night Dual. | Stores the duration credited to SE Night Dual when you intentionally import that value. | Not used for drone missions. |
single_engine_night_pic_minutes |
SE Night PIC | Stores the duration credited to SE Night PIC. | Stores the duration credited to SE Night PIC when you intentionally import that value. | Not used for drone missions. |
single_engine_night_copilot_minutes |
SE Night Co-Pilot | Stores the duration credited to SE Night Co-Pilot. | Stores the duration credited to SE Night Co-Pilot when you intentionally import that value. | Not used for drone missions. |
multi_engine_day_dual_minutes |
ME Day Dual | Stores the duration credited to ME Day Dual. | Stores the duration credited to ME Day Dual when you intentionally import that value. | Not used for drone missions. |
multi_engine_day_pic_minutes |
ME Day PIC | Stores the duration credited to ME Day PIC. | Stores the duration credited to ME Day PIC when you intentionally import that value. | Not used for drone missions. |
multi_engine_day_copilot_minutes |
ME Day Co-Pilot | Stores the duration credited to ME Day Co-Pilot. | Stores the duration credited to ME Day Co-Pilot when you intentionally import that value. | Not used for drone missions. |
multi_engine_night_dual_minutes |
ME Night Dual | Stores the duration credited to ME Night Dual. | Stores the duration credited to ME Night Dual when you intentionally import that value. | Not used for drone missions. |
multi_engine_night_pic_minutes |
ME Night PIC | Stores the duration credited to ME Night PIC. | Stores the duration credited to ME Night PIC when you intentionally import that value. | Not used for drone missions. |
multi_engine_night_copilot_minutes |
ME Night Co-Pilot | Stores the duration credited to ME Night Co-Pilot. | Stores the duration credited to ME Night Co-Pilot when you intentionally import that value. | Not used for drone missions. |
cross_country_day_dual_minutes |
XC Day Dual | Stores the duration credited to XC Day Dual. | Stores the duration credited to XC Day Dual when you intentionally import that value. | Not used for drone missions. |
cross_country_day_pic_minutes |
XC Day PIC | Stores the duration credited to XC Day PIC. | Stores the duration credited to XC Day PIC when you intentionally import that value. | Not used for drone missions. |
cross_country_day_copilot_minutes |
XC Day Co-Pilot | Stores the duration credited to XC Day Co-Pilot. | Stores the duration credited to XC Day Co-Pilot when you intentionally import that value. | Not used for drone missions. |
cross_country_night_dual_minutes |
XC Night Dual | Stores the duration credited to XC Night Dual. | Stores the duration credited to XC Night Dual when you intentionally import that value. | Not used for drone missions. |
cross_country_night_pic_minutes |
XC Night PIC | Stores the duration credited to XC Night PIC. | Stores the duration credited to XC Night PIC when you intentionally import that value. | Not used for drone missions. |
cross_country_night_copilot_minutes |
XC Night Co-Pilot | Stores the duration credited to XC Night Co-Pilot. | Stores the duration credited to XC Night Co-Pilot when you intentionally import that value. | Not used for drone missions. |
faa_cross_country_minutes |
Cross Country | Stores the duration credited to Cross Country. | Stores the duration credited to Cross Country when you intentionally import that value. | Not used for drone missions. |
instrument_approaches_count |
No. Instr. Appr. | Stores the numeric count used for No. Instr. Appr.. | No. Instr. Appr. is optional for Cabin Crew imports unless your workflow uses it. | Not used for drone missions. |
approach_types |
Approach Type | Stores the approach type names or abbreviations recorded for the flight. | Approach Type is optional for Cabin Crew imports unless your workflow uses it. | Not used for drone missions. |
takeoffs_day |
TO Day | Stores the numeric count used for TO Day. | TO Day is optional for Cabin Crew imports unless your workflow uses it. | Not used for drone missions. |
landings_day |
LDG Day | Stores the numeric count used for LDG Day. | LDG Day is optional for Cabin Crew imports unless your workflow uses it. | Not used for drone missions. |
takeoffs_night |
TO Night | Stores the numeric count used for TO Night. | TO Night is optional for Cabin Crew imports unless your workflow uses it. | Not used for drone missions. |
landings_night |
LDG Night | Stores the numeric count used for LDG Night. | LDG Night is optional for Cabin Crew imports unless your workflow uses it. | Not used for drone missions. |
floats_minutes |
Floats | Stores the duration credited to Floats. | Stores the duration credited to Floats when you intentionally import that value. | Not used for drone missions. |
tailwheel_minutes |
Tailwheel | Stores the duration credited to Tailwheel. | Stores the duration credited to Tailwheel when you intentionally import that value. | Not used for drone missions. |
helicopter_minutes |
Helicopter | Stores the duration credited to Helicopter. | Stores the duration credited to Helicopter when you intentionally import that value. | Not used for drone missions. |
turbine_minutes |
Turbine | Stores the duration credited to Turbine. | Stores the duration credited to Turbine when you intentionally import that value. | Not used for drone missions. |
glass_cockpit_minutes |
Glass | Stores the duration credited to Glass. | Stores the duration credited to Glass when you intentionally import that value. | Not used for drone missions. |
remarks |
Remarks | Stores free-text remarks, notes, or comments for the flight. | Stores free-text remarks, notes, or comments for the Cabin Crew entry. | Stores free-text mission notes, environmental conditions, payload details, or operational remarks. |
If something goes wrong
- If ProLogbooks says the response is invalid, your endpoint probably returned HTML, notices, blank output, or malformed JSON.
- If a flight is missing after sync, confirm it had a stable unique ID and all required flight fields.
- If preview stages rows but import blocks them, the user still needs to resolve unknown registrations or airports in the review UI.