api.findaflight.com.au routes /v1/* to the v3 Partner API while preserving legacy extension traffic.
Partner API v1
Find a Flight Partner API
Production award-seat search for partner products that need clear provenance, privacy-safe enrichment, and reliable handoff rules. The live surface is deliberately narrow, tested, and ready for server-side integration.
- Live base URL
- https://api.findaflight.com.au/v1
- Live endpoint
- POST /v1/search
- Direct gateway URL
- https://vaqvasz1b3.execute-api.ap-southeast-2.amazonaws.com/v1
- Commercial model
- Software and data access only; partners handle booking and travel payments.
Quickstart
Make a production search call
Use a partner key with search:write, keep it server-side, and treat warnings as product-critical response data. This request shape is live on the branded API host.
curl -X POST "https://api.findaflight.com.au/v1/search" \
-H "Authorization: Bearer $FAF_PARTNER_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: search-demo-001" \
-d '{
"origin": "MEL",
"destinations": ["SIN", "HND"],
"departure_date": "2026-09-15",
"cabin_classes": ["business"],
"max_results": 10,
"partner_context": {
"partner": {
"partner_tenant_id": "payrewards-demo",
"partner_user_id_hash": "sha256:example"
},
"rewards": {
"balance_band": "250k_500k",
"preferred_transfer_partners": ["Qantas", "KrisFlyer"]
},
"payments": {
"volume_band": "50k_250k_monthly",
"category_mix": ["ATO", "Suppliers"]
},
"consent": {
"personalisation": true,
"marketing": false,
"data_sharing": true,
"profiling": true
}
}
}'Operational proof
What is live today
Unauthenticated search requests return 401. Active keys are matched by hash and scope.
The live endpoint returns partner-shaped availability, usage units, warnings, and pagination metadata.
YAML and JSON specs are served from the portal with the branded production server first.
Authentication
Use an issued partner key as a Bearer token from a server-side service. Keys are stored as hashes only, carry scopes, and should never be embedded in browsers or mobile apps.
Freshness
Every result is shaped around observed time, source type, confidence, warnings, and refresh caveats so partner products can decide what to show, suppress, or recheck.
Privacy
Pass derived context where possible: hashes, tokenised IDs, bands, categories, and consent flags. Raw email, phone, names, loyalty member IDs, and customer PII are excluded from partner context.
Usage
Search calls are metered with tenant, client, endpoint, cache, and result-count context. The response includes the units charged for the request.
Sandbox
Use demo-scoped partner keys, OpenAPI examples, and low-volume smoke searches to validate integrations before production traffic. The same v1 contract is used for search, refresh, alerts, webhooks, usage, and entitlements.
Webhooks
Webhook endpoint registration, event inspection, and HMAC signature contracts are live for server-side partner integrations.
API reference
Production status by route
Every route in this table is enabled on the production v1 API. Use the OpenAPI contract to pin request and response shapes, then run an authenticated smoke before sending partner traffic.
/v1/searchProductionAuthenticated award availability search./v1/search/flexibleProductionFlexible-date and multi-destination search jobs./v1/searches/{search_id}ProductionAsync search status and paginated results./v1/refreshProductionLive refresh requests for routes or availability records./v1/refresh/{refresh_id}ProductionRefresh job status and result lookup./v1/availability/{availability_id}ProductionSingle availability record lookup./v1/coverageProductionCoverage, programme, and caveat reference data./v1/programmesProductionSupported points programmes./v1/airlinesProductionSupported airline and source metadata./v1/alertsProductionCreate saved availability alerts./v1/alertsProductionList saved availability alerts./v1/alerts/{alert_id}ProductionRetrieve saved alert detail./v1/alerts/{alert_id}ProductionUpdate saved alert status or expiry./v1/alerts/{alert_id}ProductionDelete saved alerts./v1/webhooks/endpointsProductionRegister partner webhook destinations./v1/webhooks/endpointsProductionList partner webhook destinations./v1/webhooks/eventsProductionInspect recorded webhook events./v1/usageProductionUsage reporting and billing support./v1/entitlementsProductionPartner quotas and enabled features.Response contract
Rank with the fields that matter
Availability is returned with enough context to build a serious partner product: route, programme, source quality, seat-count semantics, points price, usage, and warnings.
{
"search_id": "d90ee38b-6416-4b86-b493-deec572df632",
"status": "completed",
"data": [
{
"availability_id": "b0d64f78:1d8d6130",
"source_type": "indicative",
"confidence": "high",
"programme": { "code": "QFF", "name": "Qantas Frequent Flyer" },
"airline": { "code": "QF", "name": "QF" },
"route": {
"origin": "MEL",
"destination": "SIN",
"departure_at": "2026-09-15T06:00:00+10:00",
"arrival_at": "2026-09-15T16:55:00+08:00",
"stops": 1,
"stopover_airports": ["SYD"]
},
"cabin": "business",
"seat_count_kind": "unknown",
"points_price": 101400
}
],
"usage": {
"units": 1,
"unit_type": "cached_search",
"cache_units": 1
},
"warnings": [
{
"code": "indicative_results",
"severity": "warning",
"message": "Results are indicative and should be refreshed before partner handoff."
}
]
}Reliability
Handle failure before launch
A polished integration handles API boundaries as product states. Do not ship a partner surface that treats all non-200 responses the same way.
Validate airport codes, date format, cabin names, and destination count before retrying.
Check the Bearer token and keep it server-side.
Request search:write or the route-specific scope before retrying.
Reuse the same idempotency key only for the same request body.
Back off and surface a retry state in the partner product.
Retry with jitter and preserve the original idempotency key.
PayRewards enrichment
Pass useful context without raw PII
Pay can improve search, ranking, alerts, offers, analytics, and support by sending derived business and loyalty context. The API is designed for bands and tokens, not customer records.
Examples
Server-side integration snippets
Keep API keys out of browsers. These examples show the shape expected in a partner backend or BFF layer before rendering results into a PayRewards-style product experience.
type PartnerSearchRequest = {
origin: string;
destinations: string[];
departure_date: string;
flight_number?: string;
cabin_classes?: Array<"economy" | "premium_economy" | "business" | "first">;
max_results?: number;
partner_context?: Record<string, unknown>;
};
export async function searchAvailability(apiKey: string, body: PartnerSearchRequest) {
const response = await fetch("https://api.findaflight.com.au/v1/search", {
method: "POST",
headers: {
authorization: `Bearer ${apiKey}`,
"content-type": "application/json",
"idempotency-key": crypto.randomUUID()
},
body: JSON.stringify(body)
});
if (response.status === 401 || response.status === 403) {
throw new Error("Partner API key is missing, invalid, or lacks search:write.");
}
if (response.status === 429) {
throw new Error("Partner API quota reached. Retry after the response window.");
}
if (!response.ok) {
throw new Error(`Find a Flight API error: ${response.status}`);
}
return response.json();
}import os
import uuid
import requests
response = requests.post(
"https://api.findaflight.com.au/v1/search",
headers={
"Authorization": f"Bearer {os.environ['FAF_PARTNER_API_KEY']}",
"Content-Type": "application/json",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"origin": "MEL",
"destinations": ["SIN", "HND"],
"departure_date": "2026-09-15",
"cabin_classes": ["business"],
"max_results": 10,
},
timeout=20,
)
response.raise_for_status()
print(response.json()["search_id"])