ProLogbooks
Default language
Partner connectors

Implement the server-to-server API contract

Once the UI is ready, the integration is a JSON-only server conversation. There is one partner-facing repo endpoint, and two partner endpoints that the repo actively calls today. Communication between those endpoints must use HTTPS with SSL or TLS. Plain HTTP should be treated as local-development-only, not as the normal connector setup.

Direction 1: your server pushes allowed emails into ProLogbooks

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.

POST /api/v1/connectors/import-emails.php
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";
Request payload sent by your server
{
  "emails": [
    "pilot.one@example.com",
    "pilot.two@example.com",
    {
      "email": "pilot.three@example.com"
    }
  ],
  "remove_emails": [
    "former.pilot@example.com"
  ]
}
JSON returned by ProLogbooks
{
  "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.

Request payload sent by ProLogbooks
{
  "email": "pilot@example.com",
  "access_token": "stable-token-generated-by-prologbooks"
}
Success response expected by ProLogbooks
{
  "ok": true
}
Error response expected by ProLogbooks
{
  "error": "User not found in connector."
}
Manual test request for your check endpoint
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.

Request payload sent by ProLogbooks
{
  "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"
  ]
}
Valid flight response from your server
{
  "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"
    }
  ]
}
Manual test request for your preview endpoint
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.