Operator Connection Docs

Connect your operator business with GrabJet

Public guide for small and local aircraft operators who want to join GrabJet, manage fleet and bookings through our portal, or connect basic aircraft, availability, booking, and flight-status data by API.

Version: Draft v1Start: Portal or SandboxFormat: JSON

Overview

This page is for operators who want to work with GrabJet. If you do not have your own software, you can use the GrabJet operator portal. If you already manage aircraft, availability, or dispatch in another tool, you can connect by webhook or API after onboarding.

This page is intentionally focused on small operators using GrabJet's simple API or webhook flow.

Recommended path for smaller operators: start with the portal, submit aircraft and company verification, then add API/webhook sync only if your operation needs automation.

Quickstart

If you are a local operator, start here. You can become operational in GrabJet through the portal first, then add API/webhook automation only when your team is ready.

StepAction
1. ApplySubmit the operator request from the public site or contact GrabJet partnerships.
2. Get approvedGrabJet verifies company, certificate, fleet, documents, and operating contacts.
3. Start portal-firstUse the operator portal for fleet, routes, bookings, empty legs, and payouts.
4. Choose automationIf needed, choose API key or signed webhooks.
5. Test in sandboxSend sample payloads, confirm idempotency, and complete booking round-trip checks.
6. Go liveEnable production after business, operations, finance, and security sign-off.

Example API request after sandbox access

Use whichever stack your operator system already uses. These examples all send the same aircraft update payload.

curl -X POST "https://api.grabjet.com//api/v1/integrations/operators/op_123/aircraft" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: gj_sandbox_..." \
  -H "Idempotency-Key: evt_aircraft_1001" \
  -H "X-GrabJet-Event: aircraft.updated" \
  -d @aircraft.updated.json

Developer Build Checklist

If your operator system is ready to integrate, use this order. It covers what you send to GrabJet, what GrabJet sends back, and what your admin reviewer needs before production access.

StepWhat To Build / Verify
1. Store credentialsPut GRABJET_BASE_URL, GRABJET_OPERATOR_ID, GRABJET_API_KEY, and GRABJET_WEBHOOK_SECRET in server-side env/secret storage.
2. Pick enabled modulesStart with aircraft, availability, booking response, flight status, and documents. Add pricing, crew, maintenance, dispatch, payout, and notifications as needed.
3. Implement inbound senderPOST JSON to the module endpoint with X-API-Key, X-GrabJet-Event, Idempotency-Key, and Content-Type: application/json.
4. Implement outbound receiverExpose an HTTPS webhook endpoint, verify X-GrabJet-Signature, queue the event, return 2xx quickly, and dedupe by event_id.
5. Send first sandbox dataSend aircraft.updated, availability.updated, booking.accepted/rejected, flight.status_changed, and document.updated using the examples below.
6. Test duplicates and errorsReplay the same Idempotency-Key, send one invalid payload, and confirm GrabJet returns safe duplicate or validation errors without core side effects.
7. Test replay safetyReplay the same payload with the same idempotency key and confirm GrabJet safely handles duplicates.
8. Review in portalCheck Integration Status for what GrabJet received, what GrabJet sent, failed retries, and next action.
9. Save your test notesKeep request IDs, staging/apply results, and retry proof so your admin reviewer can confirm sandbox worked.
Minimum happy path: send aircraft, availability, booking response, document, and flight-status payloads; receive one booking or dispatch outbound event; prove duplicate and failed-webhook retry behavior.

Environments

GrabJet issues sandbox access before production access. Production credentials are issued only after sandbox testing and admin review are complete.

EnvironmentPurposeAccess
SandboxUsed for onboarding, payload validation, webhook tests, and booking round-trip checks.Issued after operator approval
ProductionUsed after admin confirms sandbox worked and issues live credentials.Issued after final approval

Supported Sync Data

The operator integration service supports intake, authentication, idempotency, normalization, validation, staging, and review for all data areas below. Valid records can then be reviewed and applied through GrabJet's controlled core-service workflow.

Data AreaDirectionSupported Fields / Signals
AircraftOperator to GrabJettail number, type, seats, range, airport, readiness, documents
CrewOperator to GrabJetpilot identity, license, medical, duty availability
AvailabilityTwo-wayavailability windows, booked holds, conflicts, manual review
PricingOperator to GrabJethourly rates, route pricing, reposition policy, fees
MaintenanceOperator to GrabJetgrounded state, release status, MEL/CDL restrictions
BookingGrabJet to Operatorbooking request, accept/reject, cancel, dispatch state
Empty LegsTwo-wayopportunity, publish/hide state, booking state, linked parent booking
Flight StatusOperator to GrabJetscheduled, taxi, airborne, landed, delayed, cancelled
Dispatch / ComplianceTwo-way visibilitydispatch ready/blocked, permit/compliance, readiness signals
Finance / PayoutGrabJet source of truthpayment and payout visibility
Notifications / WebhooksTwo-way visibilitybooking, dispatch, payout, and flight status event notifications
Note: the integration entry point can accept these categories. Final production access still depends on successful sandbox review.

Connection Model

Operators do not need to choose only one integration style. GrabJet supports a practical hybrid model: portal for human workflows, API for direct pushes, inbound webhooks for operator events, and outbound webhooks for GrabJet events sent back to the operator.

ChannelUsed ByBest ForDeveloper Notes
PortalOperator usersManual operationsBest first step for local operators that do not need automation yet.
REST APIOperator systemServer-to-server syncGood for scheduled or on-change updates from an internal operator system.
Inbound webhookOperator systemEvent-driven syncGood for critical events like grounded aircraft, availability changes, and flight status.
Outbound webhookGrabJetGrabJet-to-operator eventsUsed for booking requests, cancellation, dispatch readiness, empty-leg, payout, and retry visibility.
Recommended local-operator path: start portal-first, then add API or webhook automation only for the modules that create real operational value.

Staging, Review & Apply

Third-party data never writes straight into GrabJet's core aircraft, booking, dispatch, payout, or customer-facing systems. Every external event first passes through staging, validation, conflict checks, and audit. This protects both the operator and GrabJet from bad payloads, duplicate events, and booking conflicts.

StageWhat Happens
1. ReceiveGrabJet receives API or webhook data with auth, signature, rate-limit, and idempotency checks.
2. NormalizePayload fields are mapped into GrabJet's common module model while retaining original source references.
3. ValidateRequired fields, enum values, dates, airport codes, and ownership rules are checked.
4. StageThe record is stored as a staged record first. It does not write directly into core booking, aircraft, payout, or dispatch systems.
5. ReviewSafe records can be accepted automatically or by admin review. Conflicts go to manual review.
6. ApplyAccepted records are applied to core modules only through GrabJet's controlled apply workflow.
7. AuditEvery decision, duplicate, rejection, conflict, apply result, and outbound delivery is traceable.
Developer rule: a 2xx response means GrabJet accepted the event into the integration workflow. It does not always mean the data has already been applied to production core records.

Module Capability, Ownership & Frequency

Not every operator enables every module. During onboarding, GrabJet confirms which modules are enabled, who owns conflicts, and how often data should arrive. Critical operational events should be webhook-first; master data can usually sync on change or by schedule.

ModuleDirectionData OwnershipExpected FrequencyApply Rule
AircraftOperator → GrabJetOperator winsOn change or dailySafe auto when identity and readiness validate
CrewOperator → GrabJetOperator wins15-30 min or on changeSafe auto for non-conflicting readiness updates
AvailabilityOperator → GrabJetOperator wins, conflict reviewNear real-time / every few minutesManual review when it overlaps active bookings
PricingOperator → GrabJetGrabJet review or operator wins by contractHourly or on changeManual review before publishing where configured
MaintenanceOperator/provider → GrabJetOperator/provider winsImmediate webhook on grounded/released changeManual review if dispatch safety is affected
BookingGrabJet → Operator + response backGrabJet booking source of truthInstantAccept/reject response must use idempotency
DispatchTwo-way visibilityGrabJet final dispatch decisionInstant for ready/blockedBlocked states stay visible until resolved
PayoutGrabJet → OperatorGrabJet finance source of truthEvent-basedVisibility only unless finance enables deeper settlement automation

Who Should Use This

GrabJet tracks operators by origin and operating model. Some operators are created directly by GrabJet operations, some arrive through the public request flow, and local third-party operators can connect through API or signed webhook once sandbox access is issued.

Operator TypeHow It StartsConnection Path
GrabJet / System OperatorOperator is created by GrabJet admin or internal operations.Use GrabJet portal and core workflows first. Integration can be enabled later if automation is needed.
Frontend Request OperatorOperator starts from the public request or sandbox access form.GrabJet reviews the request, approves onboarding, creates the operator, then issues sandbox access if automation is required.
Third-party Local OperatorOperator has an internal system, spreadsheet workflow, or custom local software.Use Generic REST API or signed webhooks. Data is staged first, reviewed/applied, then visible in GrabJet core modules.

Before You Apply

Prepare these items before onboarding. Some fields can be completed later, but faster verification depends on clear company, fleet, document, and operations data.

RequirementWhat GrabJet Needs
Company identityLegal company name, country, operating region, registration number, and primary contact.
Operating authorityAOC/operating certificate, regulatory authority, expiry date, and relevant document copies.
Fleet basicsAircraft tail numbers, aircraft type, seats, range, base airport, documents, and readiness status.
Commercial setupRoutes, empty-leg preferences, pricing policy, payout details, and invoice contact.
Operations contact24/7 dispatch or operations contact for booking acceptance, delays, cancellation, or urgent issue handling.
Technical contactOnly required if you want API/webhook automation.

Onboarding

  1. 1Submit the operator application or contact the GrabJet partnership team.
  2. 2GrabJet verifies company, AOC/operating certificate, documents, region, fleet, and contacts.
  3. 3GrabJet admin creates or approves the operator profile.
  4. 4Operator admin users are invited to the GrabJet operator portal.
  5. 5Operator adds or confirms aircraft, routes, empty-leg rules, payout details, and operational contacts.
  6. 6GrabJet reviews aircraft readiness, airport compatibility, documents, and commercial setup.
  7. 7Operator starts receiving and managing bookings in the portal.
  8. 8API/webhook automation is enabled later only if the operator needs it.

Portal Workflow

For most local operators, this is the real starting point. The portal gives the operator a full workflow without requiring any API build.

AreaWhat Operator Does
1. ProfileMaintain company profile, regulatory details, contact information, and operational support contacts.
2. FleetAdd aircraft, readiness status, range, runway needs, documents, and maintenance/grounding state.
3. RoutesCreate sellable routes and predefined empty-leg opportunities.
4. BookingsReview new booking requests, track approvals, and coordinate mission readiness.
5. Empty LegsPublish or manage eligible repositioning legs after the main booking flow creates them.
6. PayoutsTrack payout requests, status, and settlement visibility from GrabJet.
7. NotificationsReceive alerts for booking, dispatch, payout, readiness, and operational exceptions.

Authentication

For most local operators, no API is required at the beginning. GrabJet can onboard you through the operator portal first. API key and signed webhook modes are used only when your team wants automated sync.

ModeUse CaseNotes
Portal loginOperators without an internal systemManage aircraft, routes, bookings, empty legs, payouts, and profile directly in GrabJet.
API keySimple server-to-server automationUse X-API-Key plus signed payloads.
Signed webhookEvent delivery into GrabJetUse HMAC signature of raw JSON body.

Credential Setup Guide

After sandbox approval, GrabJet issues environment-specific credentials. Keep these values server-side only. Never put API keys or webhook secrets in browser JavaScript, mobile apps, public Git repositories, screenshots, or client-side logs.

VariablePurposeExample
GRABJET_BASE_URLBackend gateway API base URL.https://api.grabjet.com/
GRABJET_API_KEYAPI key issued by GrabJet after sandbox approval.gj_sandbox_xxxxx
GRABJET_WEBHOOK_SECRETShared secret used to sign webhook payloads.whsec_xxxxx
GRABJET_OPERATOR_IDYour GrabJet operator ID from onboarding.op_123
GRABJET_ENVCurrent environment for logs and safety checks.sandbox

Recommended server environment variables

# .env
GRABJET_ENV=sandbox
GRABJET_BASE_URL=https://api.grabjet.com/
GRABJET_OPERATOR_ID=op_123
GRABJET_API_KEY=gj_sandbox_...
GRABJET_WEBHOOK_SECRET=whsec_...

# Never commit these values.
# Store production credentials in a server-side secret manager.

Versioning & Deprecation Policy

GrabJet keeps integration changes stable and versioned. Developers should safely ignore unknown optional fields and pin integrations to the documented API version.

TopicPolicy
Base pathAll public integration endpoints are namespaced under /api/v1.
Backward compatibilityGrabJet avoids breaking changes inside a stable version whenever possible.
Deprecation windowBreaking changes are announced with a target migration window before removal.
Additive changesNew optional fields may be added without a version bump. Ignore unknown fields safely.
Upgrade processGrabJet will provide migration notes, examples, and sandbox validation before production cutover.

Rate Limit Details

Sandbox limits protect the shared onboarding environment. Production limits are adjusted after expected module volume and sync frequency are reviewed.

RuleDetails
Default sandbox limit60 requests per minute per API key/operator profile unless otherwise agreed.
Production limitConfigured per operator based on fleet size, sync modules, and expected volume.
Burst behaviorShort bursts may be allowed, but sustained high volume can return 429.
429 responseBack off and retry. If Retry-After is present, wait that many seconds.
Retry safetyWhen retrying a write request, reuse the same Idempotency-Key.

Required Headers

This section applies only if the operator uses API or webhook automation. Portal-only operators do not need these headers.

HeaderDescription
AuthorizationBearer token only if GrabJet explicitly gives you token-based access for a custom setup.
X-API-KeyAPI key issued by GrabJet for sandbox or production.
X-GrabJet-SignatureHMAC signature of the raw request body.
Idempotency-KeyUnique key per event/request to prevent duplicate processing.
X-GrabJet-EventEvent name, for example aircraft.updated.
Content-Typeapplication/json
ConventionRule
FormatJSON request and response bodies.
TimestampsISO 8601 UTC, for example 2026-06-29T10:30:00Z.
Airport codesICAO preferred, IATA accepted where configured.
Distance/rangeNautical miles for aircraft range; kilometers may be accepted only if field is explicit.
MoneyMinor units or decimal amount must be agreed during onboarding; currency should be explicit.
IdsSend both your operator_reference and GrabJet reference when available.

Inbound APIs

Inbound endpoints are used when an operator sends data to GrabJet from its own system. These endpoints are sandbox-first and require authentication plus idempotency.

Receive ModeHow GrabJet Handles It
REST APIOperator posts JSON payloads to module endpoints with API key, event type, and idempotency key.
Signed webhookOperator sends event JSON to the generic webhook receiver with HMAC signature and duplicate-safe event_id.
Staging resultValid records become ready_for_review or safe-auto candidates. Invalid records create validation errors/conflicts.
MethodPathPurpose
POST/api/v1/integrations/operators/{operator_id}/webhooks/{connector}Generic signed webhook receiver for connector events.
POST/api/v1/integrations/operators/{operator_id}/aircraftSync aircraft identity, status, readiness, and operational fields.
POST/api/v1/integrations/operators/{operator_id}/crewSync crew identity, license, medical, duty availability, and assignment references.
POST/api/v1/integrations/operators/{operator_id}/availabilitySync aircraft or route availability windows and blocks.
POST/api/v1/integrations/operators/{operator_id}/pricingSync hourly rates, route pricing, empty-leg pricing, discounts, and fee signals.
POST/api/v1/integrations/operators/{operator_id}/documentsSync aircraft, operator, or crew document references and expiry states.
POST/api/v1/integrations/operators/{operator_id}/maintenanceSync grounded state, maintenance release, MEL/CDL restrictions, and release notes.
POST/api/v1/integrations/operators/{operator_id}/bookingsSync operator booking accept/reject/cancel status back to GrabJet.
POST/api/v1/integrations/operators/{operator_id}/empty-legsSync empty-leg publish, hide, booked, or linked parent booking state.
POST/api/v1/integrations/operators/{operator_id}/flight-statusSync scheduled, taxi, airborne, landed, delayed, or cancelled status.
POST/api/v1/integrations/operators/{operator_id}/dispatch-complianceSync dispatch readiness, permit/compliance, and aircraft/crew/airport readiness signals.
POST/api/v1/integrations/operators/{operator_id}/finance-payoutsSync payout or settlement visibility while GrabJet remains payment source of truth.
POST/api/v1/integrations/operators/{operator_id}/notificationsSync notification/webhook event delivery state for operator-facing events.

Pagination / List API Pattern

Most public operator endpoints are write-first. If a future endpoint returns lists, use this standard pagination shape so client code stays consistent across API versions.

ParameterMeaning
page1-based page number. Example: page=1.
page_sizeNumber of records per page. Default and max depend on endpoint policy.
sortOptional sort field, for example created_at or updated_at.
directionasc or desc.
updated_sinceOptional ISO timestamp for incremental sync where supported.

Example paginated response

GET /api/v1/integrations/operators/op_123/sync-runs?page=1&page_size=25&direction=desc

{
  "success": true,
  "data": [],
  "metadata": {
    "total": 124,
    "page": 1,
    "page_size": 25,
    "total_pages": 5,
    "has_next": true
  }
}

API Examples

Every write request follows the same pattern: send JSON to the module endpoint, include your sandbox API key, include a unique idempotency key, and set the event name in X-GrabJet-Event. Use the language tab that matches your operator system.

Aircraft sync

POST /api/v1/integrations/operators/op_123/aircraft

Use this when an operator system updates aircraft identity, location, readiness, documents, or MEL/CDL state.

Event: aircraft.updated

curl -X POST "https://api.grabjet.com//api/v1/integrations/operators/op_123/aircraft" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $GRABJET_API_KEY" \
  -H "Idempotency-Key: evt_aircraft_1001" \
  -H "X-GrabJet-Event: aircraft.updated" \
  -d @aircraft.updated.json

Availability sync

POST /api/v1/integrations/operators/op_123/availability

Use this when aircraft availability windows, holds, or operational blocks change.

Event: availability.updated

curl -X POST "https://api.grabjet.com//api/v1/integrations/operators/op_123/availability" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $GRABJET_API_KEY" \
  -H "Idempotency-Key: evt_availability_1002" \
  -H "X-GrabJet-Event: availability.updated" \
  -d @availability.updated.json

Crew sync

POST /api/v1/integrations/operators/op_123/crew

Use this for pilot identity, license, medical, duty availability, and assigned aircraft updates.

Event: crew.updated

curl -X POST "https://api.grabjet.com//api/v1/integrations/operators/op_123/crew" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $GRABJET_API_KEY" \
  -H "Idempotency-Key: evt_crew_1003" \
  -H "X-GrabJet-Event: crew.updated" \
  -d @crew.updated.json

Maintenance / MEL-CDL sync

POST /api/v1/integrations/operators/op_123/maintenance

Use this for grounded state, maintenance release, signed release, and MEL/CDL restriction updates.

Event: maintenance.release.updated

curl -X POST "https://api.grabjet.com//api/v1/integrations/operators/op_123/maintenance" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $GRABJET_API_KEY" \
  -H "Idempotency-Key: evt_maintenance_1004" \
  -H "X-GrabJet-Event: maintenance.release.updated" \
  -d @maintenance.release.updated.json

Pricing sync

POST /api/v1/integrations/operators/op_123/pricing

Use this for hourly rates, route price, empty-leg price, discount policy, and fee signals.

Event: pricing.updated

curl -X POST "https://api.grabjet.com//api/v1/integrations/operators/op_123/pricing" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $GRABJET_API_KEY" \
  -H "Idempotency-Key: evt_pricing_1005" \
  -H "X-GrabJet-Event: pricing.updated" \
  -d @pricing.updated.json

Booking accept / reject

POST /api/v1/integrations/operators/op_123/bookings

Use this when GrabJet sends a booking request and the operator accepts, rejects, or cancels it.

Event: booking.accepted

curl -X POST "https://api.grabjet.com//api/v1/integrations/operators/op_123/bookings" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $GRABJET_API_KEY" \
  -H "Idempotency-Key: evt_booking_response_2001" \
  -H "X-GrabJet-Event: booking.accepted" \
  -d @booking.accepted.json

Empty-leg sync

POST /api/v1/integrations/operators/op_123/empty-legs

Use this for empty-leg opportunity publish, hide, booked, or parent-booking linkage updates.

Event: empty_leg.updated

curl -X POST "https://api.grabjet.com//api/v1/integrations/operators/op_123/empty-legs" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $GRABJET_API_KEY" \
  -H "Idempotency-Key: evt_empty_leg_1006" \
  -H "X-GrabJet-Event: empty_leg.updated" \
  -d @empty_leg.updated.json

Flight status sync

POST /api/v1/integrations/operators/op_123/flight-status

Use this for scheduled, taxi, airborne, landed, delayed, cancelled, and telemetry-like status updates.

Event: flight.status_changed

curl -X POST "https://api.grabjet.com//api/v1/integrations/operators/op_123/flight-status" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $GRABJET_API_KEY" \
  -H "Idempotency-Key: evt_flight_status_1007" \
  -H "X-GrabJet-Event: flight.status_changed" \
  -d @flight.status_changed.json

Dispatch / compliance sync

POST /api/v1/integrations/operators/op_123/dispatch-compliance

Use this for dispatch ready/blocked, permit status, and aircraft/crew/airport readiness signals.

Event: dispatch.readiness.updated

curl -X POST "https://api.grabjet.com//api/v1/integrations/operators/op_123/dispatch-compliance" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $GRABJET_API_KEY" \
  -H "Idempotency-Key: evt_dispatch_1008" \
  -H "X-GrabJet-Event: dispatch.readiness.updated" \
  -d @dispatch.readiness.updated.json

Compliance status sync

POST /api/v1/integrations/operators/op_123/dispatch-compliance

Use this for permit, readiness, and compliance pass/fail state that should stay auditable before core use.

Event: dispatch.compliance.updated

curl -X POST "https://api.grabjet.com//api/v1/integrations/operators/op_123/dispatch-compliance" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $GRABJET_API_KEY" \
  -H "Idempotency-Key: evt_compliance_1011" \
  -H "X-GrabJet-Event: dispatch.compliance.updated" \
  -d @dispatch.compliance.updated.json

Finance / payout visibility

POST /api/v1/integrations/operators/op_123/finance-payouts

Use this for payout or settlement visibility. GrabJet remains payment source of truth.

Event: payout.status_changed

curl -X POST "https://api.grabjet.com//api/v1/integrations/operators/op_123/finance-payouts" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $GRABJET_API_KEY" \
  -H "Idempotency-Key: evt_payout_1009" \
  -H "X-GrabJet-Event: payout.status_changed" \
  -d @payout.status_changed.json

Notification delivery sync

POST /api/v1/integrations/operators/op_123/notifications

Use this when your system reports delivery state for booking, dispatch, payout, or flight-status events.

Event: notification.delivery.updated

curl -X POST "https://api.grabjet.com//api/v1/integrations/operators/op_123/notifications" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $GRABJET_API_KEY" \
  -H "Idempotency-Key: evt_notification_1010" \
  -H "X-GrabJet-Event: notification.delivery.updated" \
  -d @notification.delivery.updated.json

Outbound Webhooks

Outbound events are sent by GrabJet to the operator system when GrabJet needs acceptance, cancellation sync, dispatch visibility, or finance visibility.

EventMeaning
booking.requestedGrabJet requests operator acceptance for a customer booking.
booking.cancelledA GrabJet booking was cancelled or voided.
dispatch.readyA mission cleared core dispatch readiness checks.
dispatch.blockedA mission is blocked by aircraft, crew, maintenance, airport, or compliance truth.
payout.status_changedA payout state changed and is visible to the operator.
flight.status_changedFlight status changed and can be reflected to operator systems.
Payload FieldMeaning
event_idUnique GrabJet event ID. Use it for duplicate-safe processing.
event_typeBusiness event such as booking.requested, dispatch.ready, empty_leg.booked, payout.status_changed.
operator_idGrabJet operator identifier for the receiving operator.
created_atUTC event creation timestamp.
reference_idOptional business reference supplied by GrabJet, booking, dispatch, payout, or admin action.
dataModule-specific payload. Store unknown fields safely; GrabJet may add optional fields over time.

Outbound Delivery & Retry Visibility

GrabJet outbound delivery is queue-based. That means core booking and dispatch work can continue even if an operator endpoint is temporarily unavailable. Operators should build receivers that are fast, duplicate-safe, and easy to retry.

FeatureWhat Developers Should Know
Queue firstGrabJet queues outbound events before delivery so booking/dispatch workflows do not depend on an operator endpoint being online.
Signed deliveryOutbound webhooks include event identity and can be verified by the operator receiver.
Retry trackingTemporary failures are retried and visible in the delivery queue with attempt count and last error.
IdempotencyOperators should treat event_id as duplicate-safe and avoid double-processing repeated deliveries.
Latency visibilityDelivery latency can be measured so operators can see whether webhook delivery is healthy.
Manual resendGrabJet admin can retry failed deliveries after the operator receiver is fixed.
If your receiver fails, GrabJet records the last error, attempt count, and delivery status. Once your endpoint is fixed, GrabJet can retry the failed delivery without creating a duplicate business event.

Webhook Receiver Requirements

If GrabJet sends events to your system, your receiver must be reliable, quick to acknowledge, and safe against duplicates.

RequirementRule
Public HTTPS URLOperator webhook receiver must be reachable over HTTPS in production.
Response statusReturn any 2xx status only after the event is safely accepted or queued.
TimeoutRespond quickly. Long processing should happen asynchronously after accepting the event.
Signature verificationVerify X-GrabJet-Signature against the raw request body before processing.
Duplicate eventsUse event_id or Idempotency-Key to ignore safe duplicates.
Error responseReturn 4xx for permanent validation/auth failures and 5xx only for temporary failures.

End-to-End Flow Diagrams

These are the practical integration flows most operators implement first. Treat each row as a real-world sandbox workflow before going live.

FlowDirectionWhat Happens
Aircraft syncOperator system → GrabJetOperator sends aircraft.updated with tail, type, range, current airport, readiness, maintenance release.
Availability syncOperator system → GrabJetOperator sends availability.updated. GrabJet stages it and flags conflicts with active bookings.
Booking requestGrabJet → OperatorGrabJet sends booking.requested to the operator webhook when operator acceptance is required.
Booking responseOperator system → GrabJetOperator sends booking.accepted or booking.rejected to the bookings endpoint.
Flight statusOperator system → GrabJetOperator sends scheduled, taxi, airborne, landed, delayed, or cancelled updates.
Payout visibilityGrabJet → OperatorGrabJet remains payment source of truth and can send payout.status_changed for visibility.

Aircraft Sync

1Operator System
2GrabJet Staging
3Core Fleet Review

Booking Round Trip

1GrabJet Booking
2Operator Accept/Reject
3Dispatch Decision

Flight Status

1Operator Dispatch
2GrabJet Tracking
3Customer/Ops Visibility

Local Operator Data Contract

Local operators should send GrabJet's generic contract. Canonical IDs are welcome, but stable local references such as booking_reference, empty_leg_reference, payout_reference, notification_reference, crew_reference, and flight_reference are also accepted.

ModuleAccepted IdentityRequired Business FieldsUseful Optional FieldsDirection
Aircrafttail_number or registrationaircraft_type/type/modelstatus, seats, range, base/current airport, readiness_status, document/insurance/certificate status, maintenance release, MEL/CDLOperator → GrabJet
Crewcrew_id, crew_reference, email, or license_numbernone beyond identityname, role, license expiry, medical expiry, type rating, duty_status, available window, assigned aircraftOperator → GrabJet
Availabilitytail_number, registration, aircraft_id, or aircraft_external_idavailable_from/start_time and available_to/end_timeairport, status, booked hold, booking_reference, conflict status/reason, manual review flag, notesOperator → GrabJet
Pricingexternal_id, pricing_reference, aircraft reference, route, or booking_referenceprice/hourly_rate/quote_totalcurrency, route/empty-leg price, discount, fees, reposition policy/fee, minimum hours, tax/surcharge, valid_untilOperator → GrabJet
Maintenancetail_number, registration, aircraft_id, or aircraft_external_idstatus or maintenance_statusgrounded, MEL/CDL items, release status/reference, release expiry, notesOperator → GrabJet
Documentsdocument_id, document_reference, license_number, or certificate_numberdocument_type/typedocument number, tail/aircraft ref, crew ref/license, issue/expiry date, file URL, issuer, statusOperator → GrabJet
Bookingbooking_id, booking_reference, or external_idnone beyond identityaccepted, status, operator confirmation, cancel/reject reason, dispatch_state, ETA, notesTwo-way
Empty Legsempty_leg_id, empty_leg_reference, or parent booking referencedeparture/arrival airport, origin/destination, or routepublish/booking state, linked parent booking, price, currency, availability/departure window, passengersTwo-way
Flight Statusflight_id, flight_reference, booking reference, or tail_numberstatus or phasescheduled/actual times, position, altitude, speed, heading, ETA, delay reasonOperator → GrabJet
Dispatchdispatch/aircraft/booking reference or tail_numbernone beyond identitydispatch_status, aircraft/crew/airport readiness, permit/compliance/readiness status, blocked_by, resolution_requiredTwo-way
Compliancecompliance, booking, flight, aircraft, or tail referencecompliance/dispatch/readiness/permit statuspermit_reference, blocked_by, resolution_required, notesTwo-way
Finance / Payoutpayout, payment, booking, or external referencestatus/payout_status/payment_statusamount, currency, settlement reference, estimated settlement date, scheduled/paid time, failure reasonGrabJet → Operator mostly
Notificationsevent, notification, booking, or related booking referenceevent_type/type/message/descriptionchannel, delivery_status, attempts, last_errorTwo-way visibility
Enum / StatusAllowed Values
Aircraft statusactive, inactive, maintenance, unavailable
Availability statusavailable, unavailable, scheduled, maintenance, blocked
Booking statusrequested, accepted, rejected, cancelled, updated
Empty-leg statusdraft, published, booked, hidden, cancelled
Flight statusscheduled, taxi, airborne, landed, delayed, cancelled
Dispatch statusready, blocked, pending
Payout statuspending, scheduled, processing, paid, failed, cancelled
Notification deliveryqueued, delivered, failed, retrying, skipped
External data is never written directly into core GrabJet aircraft, booking, dispatch, payout, or customer-facing tables. It is staged, validated, conflict-checked, audited, then applied only through GrabJet's controlled apply workflow.

Full Payload Field Reference

Every endpoint uses a shared event envelope plus module-specific fields inside data. During onboarding, GrabJet can map small additional operator fields into this structure.

FieldTypeRequirementValidation / Meaning
event_idstringRequiredUnique event reference. Used for idempotency and audit trace.
event_typestringRequiredEvent name, for example aircraft.updated or booking.accepted.
operator_referencestringRequiredYour stable operator/system reference.
occurred_atISO 8601 stringRequiredUTC event time from the source system.
data.tail_numberstringRequired for aircraft/flightAircraft registration or tail number.
data.statusstringRequired for state updatesModule-specific status such as available, airborne, accepted, blocked.
data.booking_id / data.booking_referencestringRequired for booking/flight/dispatch/payout when availableGrabJet booking ID or booking reference.
data.empty_leg_id / data.empty_leg_referencestringRequired for empty-leg syncOperator or GrabJet empty-leg reference.
data.payout_id / data.payout_referencestringRequired for payout syncPayout or settlement reference.
data.notification_id / data.notification_referencestringRequired for notification syncDelivery or notification reference.
data.currencystringRequired for moneyISO currency code, for example USD.
data.amount / pricenumberRequired for moneyDecimal amount unless a different minor-unit rule is agreed during onboarding.
data.notes / messagestringOptionalHuman-readable note for operations or manual review.

Payload Examples

Use these examples to understand the expected event envelope. The exact field mapping can be adjusted during onboarding, but every event should include a stable event reference and operator reference.

{
  "event_id": "evt_aircraft_1001",
  "event_type": "aircraft.updated",
  "operator_reference": "OP-ACME-001",
  "occurred_at": "2026-06-29T10:30:00Z",
  "data": {
    "tail_number": "N900GJ",
    "aircraft_type": "Gulfstream G650",
    "seats": 14,
    "max_range_nm": 7000,
    "current_airport": "OMDB",
    "status": "available",
    "maintenance_release_status": "released",
    "mel_cdl_restricted": false
  }
}

Idempotency Guide

Idempotency prevents duplicate bookings, duplicated aircraft updates, and repeated webhook side effects when networks timeout or operators retry requests.

RuleExplanation
Key formatUse a stable key per event, for example evt_aircraft_1001 or provider-event-id.
Retry behaviorIf a network timeout occurs, retry with the exact same Idempotency-Key and same payload.
Duplicate responseDuplicate keys should not create duplicate core changes. GrabJet may return existing accepted/staged result.
Key scopeUse unique keys per operator and event. Do not reuse the same key for different payloads.
RetentionGrabJet keeps dedupe evidence for audit/replay protection according to the integration policy.

Webhook Retry Rules

Operators should retry safely based on response status. When retrying a write request after a timeout or 5xx, use the same idempotency key.

ResponseWhat To Do
2xxConsider delivered. Do not retry.
400 / 422Payload or mapping issue. Fix data before retrying with a new event if payload changes.
401 / 403Credential or permission issue. Do not retry blindly; rotate/check credentials.
409Conflict or duplicate. Review response and conflict queue before retrying.
429Rate limited. Retry after backoff or Retry-After header if provided.
5xx / timeoutRetry with exponential backoff and the same idempotency key.

Errors

Failed requests return a stable error envelope. Validation errors do not apply data into core systems; they are recorded for review.

Error response

{
  "success": false,
  "error": {
    "code": "invalid_payload",
    "message": "tail_number is required",
    "field": "data.tail_number",
    "request_id": "req_01J..."
  }
}

Error Troubleshooting

Use this table when a sandbox request fails. Most failures are caused by wrong environment credentials, missing module permissions, duplicate idempotency keys, or payload mapping differences.

Error / SymptomLikely CauseFix
401 invalid api keyMissing, expired, or environment-mismatched key.Check GRABJET_API_KEY and make sure sandbox key is used with sandbox URL.
403 module not enabledCredential is valid but module is not enabled.Ask GrabJet admin to enable the module for this operator profile.
409 duplicate eventSame Idempotency-Key already processed.Treat as safe duplicate unless payload differs; do not create a second event.
409 availability conflictAvailability conflicts with active booking hold.Review manual conflict with operations before applying.
422 mapping failedPayload field cannot map to GrabJet model.Check field names, required values, airport codes, and enum values.
429 rate limitedToo many requests in a short window.Back off and retry later with same idempotency key.
Webhook not receivedOperator endpoint unreachable or signature rejected.Check public HTTPS URL, HMAC secret, firewall, and response status.

Status Codes

Use status codes to decide whether to retry, fix the payload, or contact GrabJet support. Always retry write requests with the same idempotency key.

StatusMeaning
200Request accepted and processed successfully.
202Request accepted for staging/review but not yet applied to core systems.
400Invalid payload, missing field, or failed validation.
401Missing or invalid API key/token/signature.
403Credential is valid but not allowed for this operator/module.
409Duplicate idempotency key or availability/booking conflict requiring review.
422Payload is syntactically valid but cannot be mapped to GrabJet fields.
429Rate limit exceeded.
500Unexpected server error. Retry only with the same idempotency key.

Sample Success Responses

Successful responses confirm whether GrabJet accepted the event immediately or staged it for manual review. A 2xx response does not always mean the data was directly applied to production core records.

Accepted / validated response

{
  "success": true,
  "data": {
    "event_id": "evt_aircraft_1001",
    "operator_id": "op_123",
    "module": "aircraft",
    "status": "accepted",
    "stage": "validated",
    "duplicate": false,
    "request_id": "req_01J...",
    "received_at": "2026-06-29T10:30:02Z"
  }
}

Staged for manual review response

{
  "success": true,
  "data": {
    "event_id": "evt_availability_1002",
    "status": "staged_for_review",
    "attention_required": true,
    "reason": "availability conflicts with active GrabJet booking hold",
    "conflict_reference": "conflict_789"
  }
}

Validation Enum Reference

Use these values where applicable. If your system has different values, map them during onboarding instead of sending unknown statuses directly.

Field / AreaAllowed Values
aircraft statusavailable, unavailable, maintenance, grounded, inactive
maintenance_release_statusreleased, pending, expired, blocked
booking decisionbooking.accepted, booking.rejected, booking.cancelled
empty leg statusdraft, published, hidden, booked, cancelled, expired
flight statusscheduled, taxi, airborne, landed, delayed, cancelled
dispatch statusready, blocked, attention_required, pending_review
permit statusnot_required, pending, approved, rejected, expired
payout statuspending, scheduled, processing, paid, failed, cancelled
notification deliveryqueued, delivered, failed, retrying, skipped

Webhook Verification

For API/webhook operators, GrabJet expects signed payloads. Sign the raw JSON request body with the webhook secret issued during onboarding.

HMAC signature pattern

signature = HMAC_SHA256(
  secret = webhook_secret,
  message = raw_request_body
)

Header:
X-GrabJet-Signature: sha256=<hex_digest>

Verify signature in your stack

Always verify against the raw request body before JSON parsing changes whitespace or ordering.

import crypto from "node:crypto"

export function verifyGrabJetSignature(rawBody, signatureHeader, webhookSecret) {
  const expected = "sha256=" + crypto
    .createHmac("sha256", webhookSecret)
    .update(rawBody, "utf8")
    .digest("hex")

  const expectedBuffer = Buffer.from(expected)
  const receivedBuffer = Buffer.from(signatureHeader || "")

  return expectedBuffer.length === receivedBuffer.length &&
    crypto.timingSafeEqual(expectedBuffer, receivedBuffer)
}

Postman Collection / OpenAPI

GrabJet can provide a sandbox Postman collection or OpenAPI file after operator approval. Until credentials are issued, use the files below to prepare payloads and environment variables.

ArtifactPurposeAvailability
Postman collectionImport endpoints, headers, sample payloads, and sandbox variables.Downloadable starter file below
OpenAPI fileGenerate typed clients or validate request/response schema.Downloadable starter file below
Mock payload packRun local tests before real credentials are available.Available during technical onboarding

Postman environment variables

GRABJET_BASE_URL = https://api.grabjet.com/
GRABJET_OPERATOR_ID = op_123
GRABJET_API_KEY = gj_sandbox_...
GRABJET_WEBHOOK_SECRET = whsec_...

Downloadable Integration Pack

These starter files make the docs easier to test locally. Replace sample values with sandbox credentials after GrabJet approves your operator access.

Sandbox status page: https://status.grabjet.com. If this page is not available for your onboarding environment yet, GrabJet support will share temporary status updates through your sandbox ticket.

SDK / Client Helper Examples

GrabJet does not require a heavy SDK. Many operators can use a tiny server-side helper around fetch or requests. Keep credentials on the server.

class GrabJetClient {
  constructor({ baseUrl, apiKey, operatorId }) {
    this.baseUrl = baseUrl.replace(/\/$/, "")
    this.apiKey = apiKey
    this.operatorId = operatorId
  }

  async postModule(modulePath, eventName, idempotencyKey, payload) {
    const response = await fetch(
      `${this.baseUrl}/api/v1/integrations/operators/${this.operatorId}/${modulePath}`,
      {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          "X-API-Key": this.apiKey,
          "Idempotency-Key": idempotencyKey,
          "X-GrabJet-Event": eventName,
        },
        body: JSON.stringify(payload),
      }
    )

    if (!response.ok) throw new Error(await response.text())
    return response.json()
  }
}

Testing

Before asking for live access, run these tests in sandbox. This protects the operator and GrabJet from duplicate events, bad payloads, booking conflicts, and broken webhook retry behavior.

TestExpected Result
Happy pathSend one valid aircraft update and verify it enters staged/ready state.
Duplicate eventReplay the same Idempotency-Key and verify no duplicate core change is created.
Bad authSend request without valid key/signature and confirm 401.
Malformed payloadRemove a required field and confirm stable validation error.
ConflictSend availability that conflicts with an active booking and confirm manual review.
Booking round-tripReceive booking.requested and return booking.accepted or booking.rejected.
Webhook retryTemporarily fail your receiver and confirm retry behavior with same event reference.

Sandbox Test Checklist

Use this checklist before asking GrabJet for production access. It gives both teams a simple pass/fail view of whether sandbox worked.

StepChecklist ItemEvidence Needed
1Request sandbox accessSubmit company, contact, modules, auth preference, and technical contact.
2Receive credentialsConfigure base URL, API key, webhook secret, and operator ID in server env.
3Send aircraft updatePOST aircraft.updated and confirm accepted/staged response.
4Send availability updatePOST availability.updated and verify conflict handling if availability overlaps bookings.
5Run booking round-tripReceive booking.requested, then POST booking.accepted or booking.rejected.
6Send flight statusPOST flight.status_changed through scheduled → airborne → landed sample flow.
7Test duplicatesReplay same idempotency key and confirm no duplicate processing.
8Test bad authSend invalid key/signature and confirm request is rejected.
9Review resultsAttach logs/screenshots/results to your admin review notes.
10Production approvalGrabJet issues production credentials after sign-off.

Security Requirements

Production access requires basic integration security controls. GrabJet may request screenshots, logs, or implementation notes for these items during go-live review.

RequirementRule
HTTPS onlyAll API and webhook URLs must use HTTPS in production.
Secret storageStore API keys and webhook secrets server-side only. Never expose in browser/mobile clients.
HMAC signaturesUse raw request body and shared secret to verify webhook authenticity.
IP allowlistOptional if your team uses static server IPs and wants extra inbound protection.
Secret rotationRotate sandbox/production secrets when staff changes, systems migrate, or credentials are suspected leaked.
Log redactionDo not log full API keys, bearer tokens, webhook secrets, passport/license numbers, or medical document details.
Least privilegeEnable only the modules your operator integration actually needs.

Operational Safety Controls

GrabJet can pause integration traffic without shutting down the operator's core portal workflow. These controls are designed for safety incidents, bad data, endpoint failures, credential exposure, or supervised go-live decisions.

ControlEffectWhen Used
Pause inboundBlocks external API and webhook intake before data reaches staging.Unsafe payloads, suspected credential leak, or bad automated sync.
Pause outboundStops new GrabJet-to-operator outbound events from being queued.Operator receiver is down, returning bad responses, or receiving duplicate side effects.
Rotate credentialsReissues sandbox or production credentials with audit trail.Secret exposure, team change, system migration, or compromised endpoint.
Force live overrideSuper Admin-only emergency/demo override with mandatory reason and audit trail.Exceptional supervised cases only; real sandbox review is still expected.
Resume integrationReopens traffic after review, receiver fix, or credential rotation.After the safety condition is resolved and verified.
Important: safety controls are audited. Production override is an exception path, not a replacement for real sandbox review.

Module Mapping

ModuleDirectionTypical Fields
AircraftOperator to GrabJettail number, type, seats, range, airport, readiness, documents
CrewOperator to GrabJetpilot identity, license, medical, duty availability
AvailabilityTwo-wayavailability windows, booked holds, conflicts, manual review
PricingOperator to GrabJethourly rates, route pricing, reposition policy, fees
MaintenanceOperator to GrabJetgrounded state, release status, MEL/CDL restrictions
BookingGrabJet to Operatorbooking request, accept/reject, cancel, dispatch state
Empty LegsTwo-wayopportunity, publish/hide state, booking state, linked parent booking
Flight StatusOperator to GrabJetscheduled, taxi, airborne, landed, delayed, cancelled
Dispatch / ComplianceTwo-way visibilitydispatch ready/blocked, permit/compliance, readiness signals
Finance / PayoutGrabJet source of truthpayment and payout visibility
Notifications / WebhooksTwo-way visibilitybooking, dispatch, payout, and flight status event notifications

Live Access Checklist

Portal-only operators can go live after business verification, fleet readiness, payout setup, and portal training. API-connected operators need the additional technical checks below.

GateRequired Before Production
Business approvalCompany, AOC/certificate, aircraft, documents, regions, and contacts verified.
Portal readinessOperator admin users invited, trained, and able to manage fleet/bookings/payout visibility.
Fleet readinessAircraft status, range, documents, maintenance release, and operating airports reviewed.
Payout setupPayout account, settlement contact, and finance workflow confirmed.
Optional API credentialsSandbox base URL, API key, and webhook secret configured if automation is enabled.
Optional initial syncAircraft, availability, and required module sync passed validation if API/webhook automation is used.
Optional booking round-tripGrabJet booking request accepted/rejected by operator sandbox if API booking sync is enabled.
Security sign-offAuth, HMAC, IP/rate-limit policy, and secret storage approved for API-connected operators.

Glossary

Shared language for operators, developers, and operations teams during integration work.

TermMeaning
AOCAir Operator Certificate. Regulatory approval for commercial air operations.
MEL/CDLMinimum Equipment List / Configuration Deviation List. Determines whether aircraft can dispatch with restrictions.
FBOFixed Base Operator. Ground handling, fuel, and passenger support at an airport.
PPRPrior Permission Required. Airport or slot approval needed before operating.
Empty legA repositioning flight segment that can be sold after or before a primary booking.
DispatchOperational release decision across aircraft, crew, airport, maintenance, and compliance readiness.
HMACHash-based message authentication code used to verify webhook payload authenticity.
IdempotencyDuplicate-safe request behavior using a stable key per event.
ICAO / IATAICAO is usually 4-letter airport code; IATA is usually 3-letter commercial airport code.
SandboxNon-production environment for integration tests before live credentials are issued.

Changelog

Track public integration doc and API contract changes here. Operators should review changelog entries before production credential upgrades.

VersionChange
Draft v1Initial public operator integration docs for portal, API, webhook, and sandbox-first onboarding.
Draft v1.1Added full module examples, field reference, idempotency, retry rules, security, and sandbox checklist.
FutureExpanded OpenAPI/Postman package and more starter helpers can be added later if operators need them.

Developer FAQ

Common questions from operators and engineering teams during onboarding.

QuestionAnswer
Can I start portal-only?Yes. Most small operators should start with the operator portal, then add API automation later.
When do I get production keys?After business verification, sandbox tests, booking round-trip, security checks, and go-live sign-off.
What if I send the same event twice?Use the same Idempotency-Key. GrabJet treats it as a duplicate instead of creating duplicate side effects.
Can GrabJet consume my existing system data?Yes. After onboarding, start with generic API or webhook payloads from your existing tool.
Do I need OAuth?No for the normal small-operator flow. API key plus signed webhook is the standard path.
What if my payload fields are different?GrabJet can map small field differences during onboarding. Start with the generic API/webhook contract first.

Support

During onboarding, GrabJet separates business, operations, technical, and finance support so each issue reaches the right team quickly.

Support AreaCovers
Business onboardingCompany verification, AOC/certificate, operating region, commercial terms.
Operations supportBooking acceptance, dispatch readiness, delay/cancellation coordination.
Technical supportSandbox credentials, webhook signatures, API payloads, mapping errors.
Finance supportPayout account setup, settlement status, invoice/payment questions.
PriorityWhen To UseTarget First ResponseEscalation Path
P0 Production outageProduction integration down, booking/dispatch blocked for live operator.15 minutesIntegration support + operations escalation
P1 Critical workflow issueBooking accept/reject, dispatch, or payout visibility failing for one live operator.30 minutesTechnical support + operator success
P2 Sandbox blockerSandbox credential, payload, mapping, or webhook test blocked.1 business dayTechnical onboarding
P3 Docs / mapping questionField mapping clarification or non-blocking docs issue.2 business daysDeveloper support