Trip Creation API
Push trip data from any external system — ERPs, custom scheduling tools, other FBO software — directly into AirPlx. One POST request creates trips on your schedule, with the same data quality and aircraft matching as the email integration, but without the email.
How It Works
External System POST /api/v1/trips AirPlx
(ERP, scheduler, -----------------------> processes request,
custom tool) with Bearer token matches aircraft,
creates trips
JSON response
<----------------------- returns per-trip
status- You generate an API key in AirPlx Settings
- Your system sends a POST request with one or more trips
- AirPlx matches aircraft, validates data, and creates the trips
- Each trip gets an individual status in the response (
created,duplicate,quarantined, orfailed) - Trips appear on your schedule immediately
Quick Start
Generate an API Key
- Go to Settings > Integrations in AirPlx
- Find the API Keys card
- Click Generate New Key
- Enter a label (e.g., “ERP Integration”)
- Copy the key immediately — it won’t be shown again
Store your API key securely. Treat it like a password. If compromised, revoke it immediately in Settings and generate a new one.
Send Your First Trip
curl -X POST https://tm.airplx.com/api/v1/trips \
-H "Authorization: Bearer ak_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"trips": [
{
"tail_number": "N236MJ",
"arrival_date": "2026-03-15T14:30:00Z",
"departure_date": "2026-03-17T10:00:00Z",
"external_id": "ERP-2026-00142"
}
]
}'All dates and times must be in UTC. The Z at the end of the timestamp means UTC. The API does not perform any timezone conversion — if you send local times without converting to UTC first, your arrival and departure times will be wrong.
Verify in AirPlx
Check your schedule — the trip should appear within seconds. If the tail number isn’t in the AirPlx database, the trip is queued in your Operations Inbox for review instead.
Authentication
All requests require a Bearer token in the Authorization header. API keys are generated in Settings > Integrations.
Authorization: Bearer ak_your_api_key_hereEach API key is scoped to a single FBO. Requests are authenticated against the FBO that owns the key.
Endpoint Reference
GET /api/v1/auth/verify
Verify your API key is valid and see which FBO it’s scoped to. No data is created — use this to test your credentials before sending trips.
curl https://tm.airplx.com/api/v1/auth/verify \
-H "Authorization: Bearer ak_your_api_key_here"Response (200 OK):
{
"valid": true,
"fbo_id": "d3b07384-d113-4ec8-...",
"fbo_name": "Hailey Air Center",
"key_prefix": "ak_3f7c8a9b",
"label": "ERP Integration"
}If the key is invalid, revoked, or disabled, you’ll get a 401.
POST /api/v1/trips
Create one or more trips.
Full curl example:
curl -X POST https://tm.airplx.com/api/v1/trips \
-H "Authorization: Bearer ak_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"trips": [
{
"tail_number": "N236MJ",
"arrival_date": "2026-03-15T14:30:00Z",
"departure_date": "2026-03-17T10:00:00Z",
"external_id": "ERP-2026-00142",
"confirmation_code": "REF-001",
"operator": "NetJets Aviation",
"aircraft_type": "GL6T",
"notes": "VIP handling requested"
}
]
}'Field Reference:
| Field | Required | Type | Description |
|---|---|---|---|
tail_number | Yes | string | Aircraft registration (e.g., N236MJ, G-LUXE, VHVKX) |
arrival_date | No | string | Arrival date/time in UTC. ISO 8601 format (e.g., 2026-03-15T14:30:00Z). Defaults to now if omitted. |
external_id | No | string | Your system’s unique identifier for this trip. Used for idempotency — sending the same external_id twice won’t create a duplicate. Auto-generated if omitted. See Idempotency. |
departure_date | No | string | Departure date/time in UTC. ISO 8601 format. Omit if departure is unknown — the trip will show as an open-ended stay. |
confirmation_code | No | string | Your reference number for this trip |
operator | No | string | Operating company name (e.g., NetJets Aviation) |
aircraft_type | No | string | ICAO type designator (e.g., GL6T, G280, C680). If omitted, AirPlx looks it up automatically from the tail number. |
notes | No | string | Free-text notes attached to the trip |
All timestamps must be in UTC. Use ISO 8601 format with the Z suffix (e.g., 2026-03-15T14:30:00Z). Unlike the email integration, the API does not convert local times to UTC — you must do this yourself before sending. If you send 2026-03-15T08:00:00Z that means 8:00 AM UTC, not 8:00 AM in your local timezone.
Response (200 OK):
{
"results": [
{
"external_id": "ERP-2026-00142",
"status": "created",
"trip_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"tail_number": "N236MJ"
}
],
"summary": {
"total": 1,
"created": 1,
"skipped": 0,
"quarantined": 0,
"failed": 0
}
}Per-Trip Statuses:
| Status | Meaning |
|---|---|
created | Trip was successfully created and appears on your schedule |
duplicate | A trip with the same external_id already exists — no new trip created |
quarantined | Aircraft tail number not found in AirPlx — trip queued in Operations Inbox for review |
failed | Processing error for this specific trip — see the error field for details |
Error Responses:
| Status Code | Meaning | Example |
|---|---|---|
| 400 Bad Request | Validation error in the request body | Missing trips array, invalid JSON, missing required fields |
| 401 Unauthorized | Invalid or missing API key | Expired key, wrong token, no Authorization header |
| 500 Internal Server Error | Unexpected server error | Retry after a short delay |
400 Error Response Example:
{
"error": "validation_error",
"message": "trips[0].tail_number is required"
}401 Error Response Example:
{
"error": "unauthorized",
"message": "Invalid or expired API key"
}Examples
curl
curl -X POST https://tm.airplx.com/api/v1/trips \
-H "Authorization: Bearer ak_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"trips": [
{
"tail_number": "N236MJ",
"arrival_date": "2026-03-15T14:30:00Z",
"departure_date": "2026-03-17T10:00:00Z",
"external_id": "ERP-2026-00142"
}
]
}'Batch Requests
Send multiple trips in a single request. Each trip is processed independently — one failure doesn’t affect others.
curl -X POST https://tm.airplx.com/api/v1/trips \
-H "Authorization: Bearer ak_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"trips": [
{
"tail_number": "N236MJ",
"arrival_date": "2026-03-15T14:30:00Z",
"departure_date": "2026-03-17T10:00:00Z",
"external_id": "BATCH-001"
},
{
"tail_number": "N700GS",
"arrival_date": "2026-03-16T09:00:00Z",
"departure_date": "2026-03-16T18:00:00Z",
"external_id": "BATCH-002"
},
{
"tail_number": "UNKNOWN",
"arrival_date": "2026-03-16T12:00:00Z",
"external_id": "BATCH-003"
}
]
}'Response:
{
"results": [
{ "external_id": "BATCH-001", "status": "created", "trip_id": "...", "tail_number": "N236MJ" },
{ "external_id": "BATCH-002", "status": "created", "trip_id": "...", "tail_number": "N700GS" },
{ "external_id": "BATCH-003", "status": "quarantined", "tail_number": "UNKNOWN" }
],
"summary": {
"total": 3,
"created": 2,
"skipped": 0,
"quarantined": 1,
"failed": 0
}
}The summary object gives you a quick count without iterating through results.
There is no limit on the number of trips per request. Send as many as you need.
Idempotency
The external_id field serves as an idempotency key. If you send a request with an external_id that already exists for your FBO, the trip is not created again — the response returns duplicate status for that trip.
First request returns status: "created". Second request with the same external_id returns status: "duplicate".
This makes it safe to retry failed requests without worrying about creating duplicate trips. If your system isn’t sure whether a previous request succeeded, send it again.
Aircraft Not Found
When the tail number in your request isn’t in the AirPlx database, the trip is not silently dropped. Instead, it’s queued in your Operations Inbox for review — the same flow as the email integration.
The response shows status: "quarantined" for that trip:
{
"external_id": "ERP-2026-00199",
"status": "quarantined",
"tail_number": "ZK-NZE"
}To resolve quarantined trips:
- Go to Operations > Inbox in AirPlx
- Find the queued item
- Add the aircraft to AirPlx (or correct the tail number if it was a typo)
- Process the item from the Inbox
Error Handling
There are two levels of errors to handle:
Request-level errors (HTTP 400, 401, 413, 500) mean the entire request failed. No trips were processed. Fix the issue and retry the full request.
Per-trip errors (HTTP 200 with status: "failed" on individual trips) mean the request was accepted but specific trips couldn’t be processed. Other trips in the same batch may have succeeded. Check the error field on failed trips for details.
{
"results": [
{ "external_id": "ERP-001", "status": "created", "trip_id": "...", "tail_number": "N236MJ" },
{ "external_id": "ERP-002", "status": "failed", "tail_number": "N67890", "error": "Invalid arrival_date format" }
],
"summary": {
"total": 2,
"created": 1,
"skipped": 0,
"quarantined": 0,
"failed": 1
}
}Recommended pattern:
- Check the HTTP status code first
- If 200, iterate through
resultsand check each trip’sstatus - Log or alert on
faileditems - Retry
faileditems after fixing the data (useexternal_idsocreateditems aren’t duplicated)
API Key Management
API keys are managed in Settings > Integrations.
Generating a key:
- Click Generate New Key
- Enter a descriptive label (e.g., “ERP Production”, “Staging Test”)
- Copy the key immediately — it is only shown once
Revoking a key:
- Find the key in the API Keys list
- Click the delete icon
- Confirm revocation — the key stops working immediately
Enabling/disabling a key:
- Find the key in the API Keys list
- Toggle the enabled/disabled switch
- Disabled keys return 401 Unauthorized — re-enable anytime without generating a new key
You can have multiple active API keys. This is useful for rotating keys without downtime — generate a new key, update your integration, then revoke the old one.
FAQ
What format should timestamps be in?
ISO 8601 in UTC. The timestamp must end with Z to indicate UTC. Examples: 2026-03-15T14:30:00Z, 2026-03-15T09:00:00Z. The API does not convert local times — always send UTC.
How do I convert my local time to UTC?
Subtract your UTC offset. For example, if you’re in US Eastern (UTC-5) and the arrival is 10:00 AM local, send 15:00:00Z. Most programming languages have built-in UTC conversion functions.
Can I update an existing trip via the API? Not currently. The API is create-only. To update a trip, use the AirPlx UI. Update support is planned for a future release.
Can I delete a trip via the API? Not currently. Use the AirPlx UI to remove trips.
What happens if I omit aircraft_type?
AirPlx looks up the aircraft type from the tail number in its database. If the tail number is found, the type is filled in automatically. If not, the trip is quarantined for review.
What happens if I omit operator?
The trip is still created. Operator is informational only — it helps your team identify who’s operating the aircraft but isn’t required for trip creation.
What happens if I omit departure_date?
The trip is created with an open-ended stay. You can update the departure time later in the AirPlx UI when it becomes known.
Is there a rate limit? No. Send as many trips as you need, as often as you need.
Can I test the API without creating real trips? Use a staging environment if one is available for your FBO. Contact AirPlx support to discuss testing options.
What if my external_id values aren’t unique across systems?
external_id uniqueness is scoped to your FBO. Two different FBOs can use the same external_id without conflict. Within a single FBO, each external_id must be unique.
Where do quarantined trips go? They appear in your Operations > Inbox. See Aircraft Not Found for the resolution workflow.