/api/public/v3
The Airspace V3 API is an asynchronous RESTful API for shipment management. It accepts JSON request bodies, returns JSON responses, and uses standard HTTP response codes and bearer token authentication.
Build integrations for order creation, quote generation, and active shipment monitoring.
# Production
https://api.airspace.com/api/public/v3
# Test
https://apitest.airspace.com/api/public/v3/authentication
All API requests require a bearer token in the Authorization header. Tokens are generated per account and never expire.
Contact integrations@airspace.com to request API keys.
curl -X GET \
https://api.airspace.com/api/public/v3/orders \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json"/environments
ProductionliveFor production use. Requires account configuration before first request.
TestsandboxFor development and testing. Behaves the same as production.
# Production
BASE_URL=https://api.airspace.com/api/public/v3
# Test / Sandbox
BASE_URL=https://apitest.airspace.com/api/public/v3/quick-start
- Get an account — Check with your Airspace Account Manager.
- Request a token — Email integrations@airspace.com. Tokens never expire.
- Configure test access — We'll set up your sandbox environment.
- Set up webhooks — Share your endpoint to receive status updates.
- Test end-to-end — Validate your integration in the test environment.
- Go live — After successful testing, we'll enable production access.
curl -X GET \
https://apitest.airspace.com/api/public/v3/orders \
-H "Authorization: Bearer <your_api_key>" \
-H "Content-Type: application/json"
# 200 OK
{
"orders": [],
"message": "Success"
}/response-codes
Standard HTTP response codes used by the API.
2xx: Success
The request was successfully received, understood, and accepted.
4xx: Client errors
The request contains missing or invalid parameters.
5xx: Server errors
Rare. The server failed to fulfill a valid request.
// Success
200 OK
202 Accepted
// Client Error
401 Unauthorized
404 Not Found
409 Conflict
422 Unprocessable Entity
// Server Error
500 Internal Server Error/ordersCreate a new shipment order.
Request fields
company_idstringGUID of child company (for multi-company accounts).
pickup_timestringScheduled pickup time. Format: "2022-02-25 02:25:00". Must be minimum 2 hours in the future for scheduled orders.
pickup_addressPickup location. See Address Object below.
delivery_addressDelivery destination. See Address Object below.
referencesArray of reference objects for internal tracking. Each has reference (string, required) and context (string, label/name).
piecesArray of piece objects with dimensions and weight. See Piece Object below.
service_typestring, default "recommended"One of: recommended, optimize_for_time, optimize_for_cost, optimize_for_green, drive_only.
has_dangerous_goodsWhether shipment contains dangerous goods.
should_hold_at_airlinesboolean, default falseHold at airline for pickup.
email_notificationsarrayEmail notification recipients. See Email Notification Object.
airtrace_assignment_overridebooleanOverride existing AirTrace tracker assignment.
required_vehicle_typestringOne of: car, van, truck, flatbed.
custom_attributesarrayCustom attribute objects. See Custom Attributes Object.
shipment_viabilityobjectViability window. See Shipment Viability Object.
Piece Object
piece_library_guidstringReference to saved piece template.
lengthLength of piece.
widthWidth of piece.
heightHeight of piece.
weightWeight of piece.
weight_unitstringlb or kg.
dimension_unitstringin or cm.
commodityItem type description.
do_not_rotatebooleanPrevent piece rotation during transit.
upidsarrayUnique piece identifiers. Each has type (string, required) and value (string, required).
barcodestringBarcode value.
barcode_typestringOne of: upc_e, ean_13, ean_8, code_39, code_93, code_128, itf, qr, data_matrix, pdf_417.
Address Object
companyCompany name.
streetStreet address.
street2stringAdditional address info.
street3stringAdditional address info (non-US only).
cityCity.
statestringState abbreviation.
zipstringPostal code.
countrystringISO 3166-1 alpha-2 code. Supported: US, CA, AU, GB, DE, BR, FR, JP, RU, IN, ID, IT, ES, MX, NO, SE, CO, CN, TR, NZ.
instructionsstringDriver delivery instructions.
contactContact details (see Contact Object).
custom_attributesarrayCustom attribute objects.
address_book_guidstringReference to saved address from address book.
Contact Object
nameContact name.
phone_numberPhone number. Examples: "6198675309", "619-867-5309", "(619)867-5309".
phone_country_codestringInternational dialing code. Default: "1".
Email Notification Object
emailEmail address for notifications.
phone_numberstring or integerPhone for SMS notifications.
phone_country_codestringInternational country code for SMS.
exception_emailbooleanReceive exception notifications.
statusesarrayStatus values to trigger notifications. Values: customer_completed, ops_acknowledged, auto_dispatch_started, in_route_to_pickup, arrived_at_pickup_location, in_route_to_tender, arrived_at_tender, accepted_by_airline, flight_departed, flight_arrived, reached_destination_airport, in_route_to_recovery, arrived_at_recovery_location, recovered_from_airline, in_route_to_destination, arrived_at_destination, package_accepted.
geofence_miles_deliveryintegerMile radius trigger from destination.
geofence_miles_pickupintegerMile radius trigger from pickup.
Custom Attributes Object
labelAttribute name.
optionstring or booleanConfigured option value.
weightnumberWeight value.
weight_unitstringlbs or kg.
amountnumberMonetary amount.
currency_codestringOne of: USD, CAD, EUR, GBP, AUD, NZD, CHF, DKK, NOK, SEK, SGD, CNY.
Shipment Viability Object
started_atStart time. Format: "2024-07-10 09:46:00 -0700". If timezone omitted, pickup address timezone is assumed.
durationintegerHours of viability. Defaults to account configuration.
curl -X POST \
$BASE_URL/orders \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"pickup_time": "2026-03-20 09:00:00",
"pickup_address": {
"company": "Airspace HQ",
"street": "100 Main St",
"city": "Carlsbad",
"state": "CA",
"zip": "92008",
"country": "US",
"contact": {
"name": "Jane Smith",
"phone_number": "6195551234"
}
},
"delivery_address": {
"company": "SF Medical Center",
"street": "200 Market St",
"city": "San Francisco",
"state": "CA",
"zip": "94105",
"country": "US",
"contact": {
"name": "John Doe",
"phone_number": "4155559876"
}
},
"pieces": [{
"weight": 5.0,
"length": 12,
"width": 8,
"height": 6,
"weight_unit": "lb",
"dimension_unit": "in",
"commodity": "Medical Device"
}],
"references": [{
"reference": "PO-12345",
"context": "Purchase Order"
}],
"service_type": "recommended",
"has_dangerous_goods": false
}'
# 202 Accepted
{
"message": "Incoming order received. See webhook for order updates.",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}/ordersList orders with filtering by status, date, references, and commodities.
Query parameters
pageinteger, default 1Page number.
page_limitinteger, default 10, max 25Results per page.
from_created_atstringMinimum creation date (ISO format).
to_created_atstringMaximum creation date (ISO format).
order[status]stringFilter by status. Use "active" for all active orders.
order[references][reference]stringFilter by reference value.
order[references][context]stringFilter by reference label.
order[pieces][barcode]stringFilter by barcode.
order[pieces][commodity]stringFilter by commodity.
order[has_dangerous_goods]booleanFilter by dangerous goods flag.
order[service_type]stringFilter by service type.
order[pieces][barcode_type]stringFilter by barcode type.
order[should_hold_at_airlines]booleanFilter by hold at airlines flag.
curl -X GET \
"$BASE_URL/orders?page=1&page_limit=10&order[status]=active" \
-H "Authorization: Bearer <token>"
# 200 OK
{
"orders": [
{
"tracking_id": "ATYFGD4P4J",
"status": "en_route_to_pickup",
"order_number": 72,
"created_at": "2026-02-28T10:00:00Z"
}
],
"pagination": {
"page": 1,
"total_pages": 1,
"page_limit": 10
},
"parameter_errors": {}
}/orders/{tracking_id}Retrieve details for a specific order by tracking ID.
Path parameters
tracking_idThe tracking ID of the order.
Response fields
tracking_idstringUnique tracking identifier.
tracking_urlstringLive tracking page URL.
order_numberintegerNumeric order ID.
statusstringCurrent order status.
current_segmentstringCurrent operation phase.
estimated_pickup_timestringISO 8601 estimated pickup.
estimated_pickup_time_localstringLocal pickup time.
estimated_delivery_timestringISO 8601 estimated delivery.
estimated_delivery_time_localstringLocal delivery time.
delivery_timestringActual delivery time (when completed).
company_namestringAssociated company name.
piecesarrayPiece objects with current_location (lat, lng, description).
podobjectProof of delivery with signature_url, name, department, image_urls, documents.
flight_informationobjectFlight details including flights array (each with airline_name, airline_iata, flight_number, departure_airport, departure_airport_iata, departure_time, arrival_airport, arrival_airport_iata, arrival_time, status) and air_waybill_numbers array.
order_sourcestringOrigin: "public_api", "customer_facing", etc.
estimated_pickup_time_timezonestringTimezone identifier for pickup estimate.
estimated_delivery_time_timezonestringTimezone identifier for delivery estimate.
pickup_time_localstringActual pickup time in local timezone.
delivery_time_localstringActual delivery time in local timezone.
delivery_time_timezonestringTimezone identifier for delivery.
created_atstringOrder creation timestamp.
will_call_activated_atstringTimestamp when will-call order was activated.
cancelled_atstringCancellation timestamp (if applicable).
company_idstringAssociated company GUID.
order_contactsarrayContact array with email, phone, and notification preferences.
imagesarrayOrder images with filename, attachment_url, latitude, longitude, piece_guid.
shipment_viabilityobjectViability window with viable_until timestamp.
curl -X GET \
$BASE_URL/orders/ATYFGD4P4J \
-H "Authorization: Bearer <token>"
# 200 OK
{
"tracking_id": "ATYFGD4P4J",
"tracking_url": "https://track.airspace.com/ATYFGD4P4J",
"order_number": 72,
"status": "en_route_to_pickup",
"current_segment": "drive",
"estimated_pickup_time": "2026-02-28T11:00:00Z",
"estimated_delivery_time": "2026-02-28T16:30:00Z",
"company_name": "Space Air Inc.",
"pieces": [{
"commodity": "Medical Device",
"weight": 5.0,
"current_location": {
"lat": 33.1581,
"lng": -117.3506,
"description": "En route"
}
}],
"pod": null,
"flight_information": null,
"order_source": "public_api"
}/orders/{tracking_id}Update an existing order. Updates are only allowed for orders in pending or customer_completed status. You cannot edit has_dangerous_goods after submission, and you cannot add or remove pieces after submission.
curl -X PATCH \
$BASE_URL/orders/ATYFGD4P4J \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"references": [{
"reference": "PO-9876",
"context": "Purchase Order"
}]
}'
# 202 Accepted
{
"message": "Order update received.",
"request_id": "660e8400-e29b-41d4-a716-446655440001"
}/orders/{tracking_id}Cancel an order by tracking ID.
curl -X DELETE \
$BASE_URL/orders/ATYFGD4P4J \
-H "Authorization: Bearer <token>"
# 202 Accepted
{
"message": "Order cancellation received.",
"request_id": "770e8400-e29b-41d4-a716-446655440002"
}/orders/{tracking_id}/activateActivate a will-call or quote order for immediate dispatch.
Optional parameters
pickup_timestringOptional scheduled pickup time.
shipment_viabilityobjectOptional viability window.
curl -X PUT \
$BASE_URL/orders/ATYFGD4P4J/activate \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"pickup_time": "2026-03-20 09:00:00"
}'
# 202 Accepted
{
"message": "Order activation received.",
"request_id": "880e8400-e29b-41d4-a716-446655440003"
}/orders/{tracking_id}/test_order_progressionTest environment only. Simulate order status progression for integration testing.
Request fields
progressArray of progression steps.
Valid progress values:
available_for_pickupin_route_to_pickuparrived_at_pickup_locationrecovered_from_airlinein_route_to_destinationarrived_at_destinationaccepted_by_airlineverified_onboardreached_destination_airportheld_at_warehousedeliveredadd_pieceremove_piecereturn_to_senderwaiterrorcurl -X PUT \
$BASE_URL/orders/ATYFGD4P4J/test_order_progression \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"progress": [
"available_for_pickup",
"in_route_to_pickup",
"arrived_at_pickup_location",
"in_route_to_destination",
"arrived_at_destination",
"delivered"
]
}'
# 202 Accepted
{
"message": "Test progression initiated.",
"request_id": "990e8400-e29b-41d4-a716-446655440004"
}/orders/quotesGenerate a pricing estimate for a shipment. The quote uses the same request body structure as order creation.
curl -X POST \
$BASE_URL/orders/quotes \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"pieces": [{
"weight": 10.0,
"length": 24,
"width": 16,
"height": 12,
"weight_unit": "lb",
"dimension_unit": "in",
"commodity": "Semiconductor"
}],
"pickup_address": {
"company": "LA Warehouse",
"street": "500 Industrial Blvd",
"city": "Los Angeles",
"state": "CA",
"zip": "90001",
"country": "US",
"contact": {
"name": "Pickup Contact",
"phone_number": "2135551234"
}
},
"delivery_address": {
"company": "Chicago Office",
"street": "100 Wacker Dr",
"city": "Chicago",
"state": "IL",
"zip": "60601",
"country": "US",
"contact": {
"name": "Delivery Contact",
"phone_number": "3125559876"
}
},
"references": [{
"reference": "QUOTE-001"
}],
"has_dangerous_goods": false
}'
# 202 Accepted
{
"message": "Quote request received.",
"request_id": "aa0e8400-e29b-41d4-a716-446655440005"
}/orders/quotes/{tracking_id}Retrieve quote details by tracking ID.
curl -X GET \
$BASE_URL/orders/quotes/ATYFGD4P4J \
-H "Authorization: Bearer <token>"
# 200 OK
{
"quote": {
"estimated_cost": {
"amount": "359.56",
"currency": "USD"
},
"estimated_delivery_time": "2026-03-01T14:00:00Z",
"order_details": {
"tracking_id": "ATYFGD4P4J",
"service_type": "recommended",
"pieces": [...]
}
}
}/orders/will_callCreate a will-call order. Will-call orders are held until explicitly activated.
curl -X POST \
$BASE_URL/orders/will_call \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"pieces": [{...}],
"pickup_address": {...},
"delivery_address": {...}
}'
# 200 OK
{
"tracking_id": "AIR-2026-WC-9012",
"status": "will_call"
}/orders/will_call/{tracking_id}Update an existing will-call order before activation.
curl -X PATCH \
$BASE_URL/orders/will_call/AIR-2026-WC-9012 \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"delivery_address": {
"street": "300 Updated Ave"
}
}'/invoicesList invoices for your account. Requires account configuration.
Query parameters
pageinteger, default 1Page number.
page_limitinteger, default 10, max 25Results per page.
from_created_atstringMinimum creation date.
to_created_atstringMaximum creation date.
order[from_created_at]stringFilter by minimum order creation date.
order[to_created_at]stringFilter by maximum order creation date.
curl -X GET \
"$BASE_URL/invoices?page=1&page_limit=10" \
-H "Authorization: Bearer <token>"
# 200 OK
{
"invoices": [...],
"pagination": {
"page": 1,
"total_pages": 1,
"page_limit": 10
}
}/address_booksList saved addresses from your address book. Returns array of address book entries with contact info, coordinates, and schedule blocks.
curl -X GET \
$BASE_URL/address_books \
-H "Authorization: Bearer <token>"
# 200 OK
{
"addresses": [
{
"id": 1,
"name": "HQ Carlsbad",
"street": "5640 Kearny Mesa Rd",
"city": "Carlsbad",
"state": "CA"
}
]
}/piece_librariesList saved piece types for reuse across orders.
curl -X GET \
$BASE_URL/piece_libraries \
-H "Authorization: Bearer <token>"
# 200 OK
{
"pieces": [
{
"id": 1,
"name": "Standard Box",
"weight": 5.0,
"length": 12,
"width": 8,
"height": 6
}
]
}/orders/events/orders/{tracking_id}/eventsRetrieve order events. Use the global endpoint for all events with the same query parameters as List Orders, or filter by tracking ID.
curl -X GET \
$BASE_URL/orders/ATYFGD4P4J/events \
-H "Authorization: Bearer <token>"
# 200 OK
{
"tracking_id": "ATYFGD4P4J",
"company_name": "Space Air Inc.",
"company_id": "ABCD123456",
"order_number": 72,
"events": [
{
"type": "status",
"name": "customer_completed",
"occurred_at_utc": "2026-02-28T10:00:00Z",
"message": null,
"delay_code": null,
"delay_category": null,
"delay_description": null
}
]
}/webhooks
Webhooks provide push notifications for order status updates rather than requiring polling. Configure your endpoint during onboarding.
Configuration Requirements
- Your endpoint must accept POST requests with JSON payload.
- Return a 2xx status code on successful receipt.
- Handle dynamic payload structures based on order state.
- Use
order.tracking_idororder.order_numberfor identification. - Use
request_idfield to correlate with original API requests.
Setup Information
Contact integrations@airspace.com with:
- Endpoint URL
- Environment (test, production, or both)
- Authentication method (username-password, bearer token, or OAuth)
- Content type (JSON)
- Request method (PUT or POST)
Event Types
Three webhook event types: milestone (status updates), delay, and cancellation.
Webhook payload fields
messagestringStatus description.
request_idstringMatches initial API response request_id.
eventsarrayEvent objects with milestone, occurred_at.
errorsobject or nullError information.
updated_order_keysarrayModified field names.
orderobjectComplete order object at time of event.
// Status Update Webhook
{
"message": "Order status is now en_route_to_destination",
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"events": [{
"milestone": {},
"occurred_at": "2026-01-22T15:30:45.123Z"
}],
"errors": null,
"updated_order_keys": ["status"],
"order": { ... }
}
// Delay Event
{
"events": [{
"event_type": "delay",
"problem": {
"code": "2-001",
"description": "Changed shipment parameters",
"delivery_eta": "2026-01-23T16:00:00.000Z",
"note": ""
}
}]
}
// Cancellation Event
{
"events": [{
"event_type": "cancellation",
"problem": {
"code": "2-007",
"description": "Nothing to Pick Up",
"delivery_eta": null,
"note": "Shipment no longer needed"
}
}]
}/reference/statuses
All possible order statuses in the V3 API.
will_callUnrouted order with expiration (typically 72 hours)pendingQuote needing submissioncustomer_completedOrder created for fulfillmentops_acknowledgedOperations team reviewedavailable_for_pickupDriver assigneden_route_to_pickupDriver traveling to pickuparrived_at_pickup_locationDriver at pickup locationen_route_to_destinationDriver en route to airport (NFO only)accepted_by_airlineDelivered to airline (NFO only)verified_onboardBoarded on plane (NFO only)reached_destination_airportArrived at destination (NFO only)available_for_recoveryAvailable for airport pickup (NFO only)in_route_to_recoveryEn route to airport (NFO only)arrived_at_recovery_locationArrived at airport (NFO only)recovered_from_airlinePicked up from airport (NFO only)arrived_at_destinationDriver at destination (drive-only)arrived_at_destination2Driver at destination (NFO only)deliveredOrder deliveredadmin_canceledOrder canceled// Typical order lifecycle
will_call
→ pending
→ customer_completed
→ ops_acknowledged
→ available_for_pickup
→ en_route_to_pickup
→ arrived_at_pickup_location
// Drive-only path
→ en_route_to_destination
→ arrived_at_destination
→ delivered
// NFO (Next Flight Out) path
→ en_route_to_destination
→ accepted_by_airline
→ verified_onboard
→ reached_destination_airport
→ available_for_recovery
→ in_route_to_recovery
→ arrived_at_recovery_location
→ recovered_from_airline
→ arrived_at_destination2
→ delivered
// Terminal
→ delivered
→ admin_canceled/reference/service-types
recommendedBest balance of speed and costoptimize_for_timeFastest delivery optionoptimize_for_costMost cost-effective optionoptimize_for_greenLowest carbon footprintdrive_onlyGround transport only, no flights{
"service_type": "recommended"
}
// Options:
// "recommended"
// "optimize_for_time"
// "optimize_for_cost"
// "optimize_for_green"
// "drive_only"/reference/vehicle-types
carStandard sedan for small shipmentsvanCargo van for medium shipmentstruckBox truck for large shipmentsflatbedFlatbed truck for oversized cargoIf a larger vehicle type is requested than required, additional charges may apply. If a smaller vehicle type is sent, Airspace will override with the system-determined vehicle based on piece count, dimensions, and weight.
{
"required_vehicle_type": "van"
}
// Options:
// "car"
// "van"
// "truck"
// "flatbed"/reference/error-codes
Standard error response formats by HTTP status code.
// 401 Unauthorized
{
"error": "Unauthorized"
}
// 404 Not Found
{
"error": "Not Found"
}
// 422 Unprocessable Entity
{
"errors": {
"bad_attribute": ["is not allowed"]
}
}Ready to integrate?
Contact our integrations team to get your API keys and start building with Airspace.
Request API Access