84trust / 100
Air Search
by travel.brij.fi in Search & web
x402 APIPassing, checked 4 h ago
Flight search
POST
https://travel.brij.fi/air/search- Price
- $0.1
- per call in USDC
- Uptime
- 100%
- last 30 days
- Response time
- 223 ms
- 280 ms slowest 5%
- Last check
- Passed
- 4 h ago, next any minute now
Reliability
All checks passedSome failedAll failedNot checked
Status and outage history · Atom feed · Watch with other listings
How to call it
POST https://travel.brij.fi/air/search
Each call costs $0.1 in USDC on Solana, paid with the request over x402.
Run a free test callOne unpaid request, the way an agent sends it. You see the payment challenge it gets back. Nothing is charged.
Example request
From the listing.
POST https://travel.brij.fi/air/search
content-type: application/json
{
"adults": 1,
"cabin_class": "economy",
"depart_date": "2026-06-10",
"destination_iata": "LIS",
"origin_iata": "MAD"
}Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
adults | integer | Yes | 1 to 9. The offer is priced for this many travellers and /air/book must supply exactly this many passengers, lead first. |
cabin_class | string | No | Optional, defaults to economy. One of: economy, premium_economy, business, first. |
cheapest_per_itinerary | boolean | No | Optional. Collapse each physical itinerary (comparison_key) to its cheapest fare; fare_options_count reports how many fares were folded. Drill into a finalist with POST /air/offer-details. |
depart_date | string (date) | Yes | |
departure_after | string | No | Optional. Outbound departs at or after this local time (HH:MM). |
departure_before | string | No | Optional. Outbound departs at or before this local time (HH:MM). Combine both for a window: afternoon = after 12:00 before 18:00. |
destination_iata | string | Yes | Destination IATA code. |
limit | integer | No | Optional. Cap the number of offers returned, cheapest first. Full responses can exceed 300 KB — LLM agents should combine this with cheapest_per_itinerary. |
max_price | string | No | Optional decimal cap on total_amount, e.g. "250.00". |
max_stops | integer | No | Optional. Maximum plane changes per direction; 0 = direct only. |
origin_iata | string | Yes | Origin IATA code. |
return_date | string (date) | No | Optional. Adds the inbound (destination back to origin); round-trip offers book both directions in one /air/book. |
sort | string | No | Optional ordering, ascending. Default price. One of: price, duration, departure, emissions. |
Example response
The provider's example. We can't check it without paying.
Example response, 57 lines
{
"search": {
"offers": [
{
"arriving_at": "2026-08-02T21:10:00",
"base_amount_decimal": "65.00",
"cabin_class": "economy",
"cabin_class_marketing_name": "ECONOMY",
"carry_on_bags_included": 1,
"checked_bags_included": 1,
"comparison_key": "cmp_abc123",
"conditions": {
"change_allowed": true,
"change_penalty_amount": "0",
"change_penalty_currency": "USD",
"refund_allowed": false
},
"departing_at": "2026-08-02T14:42:00",
"destination_iata": "LIS",
"destination_time_zone": "Europe/Lisbon",
"duration": "PT1H15M",
"fare_brand_name": "Flexible Balearic",
"id": "off_0000000000000000000000",
"identity_documents_required": false,
"origin_iata": "MAD",
"origin_time_zone": "Europe/Madrid",
"owner_name": "Iberia",
"segments": [
{
"arriving_at": "2026-08-02T17:44:00",
"carrier_name": "Iberia",
"departing_at": "2026-08-02T14:42:00",
"destination_iata": "MXP",
"flight_number": "1953",
"origin_iata": "MAD"
},
{
"arriving_at": "2026-08-02T21:10:00",
"carrier_name": "Iberia",
"departing_at": "2026-08-02T19:28:00",
"destination_iata": "LIS",
"flight_number": "1430",
"origin_iata": "MXP"
}
],
"stops": 1,
"tax_amount_decimal": "24.50",
"technical_stops": 0,
"total_amount": 216950000,
"total_amount_decimal": "216.95",
"total_currency": "USD",
"total_emissions_kg": "21"
}
],
"request_id": "orq_0000000000000000000000"
}
}Call it from code
The curl command shows the payment challenge. The JavaScript and Python versions pay and call, and never pay more than $0.1.
curl: see the payment challenge
# bash or zsh: see the payment challenge. Nothing is charged.
curl -sS -g -i -X POST 'https://travel.brij.fi/air/search' \
-H 'content-type: application/json' \
--data-raw '{"adults":1,"cabin_class":"economy","depart_date":"2026-06-10","destination_iata":"LIS","origin_iata":"MAD"}'
# x402 v2 sends the challenge base64-encoded in the PAYMENT-REQUIRED header (v1 sends it in the body).
# To read the header:
curl -sS -g -o /dev/null -D - -X POST 'https://travel.brij.fi/air/search' \
-H 'content-type: application/json' \
--data-raw '{"adults":1,"cabin_class":"economy","depart_date":"2026-06-10","destination_iata":"LIS","origin_iata":"MAD"}' \
| grep -i '^payment-required:' | cut -d' ' -f2 | tr -d '\r' | base64 --decodeJavaScript: pay and call
// npm i @x402/fetch @x402/svm @solana/kit @scure/base
import { wrapFetchWithPayment, x402Client } from "@x402/fetch";
import { registerExactSvmScheme } from "@x402/svm/exact/client";
import { createKeyPairSignerFromBytes } from "@solana/kit";
import { base58 } from "@scure/base";
// Pays at most $0.1 per call.
const client = new x402Client().setSpendControls({ maxAmountPerPayment: "$0.1" });
registerExactSvmScheme(client, { signer: await createKeyPairSignerFromBytes(base58.decode(process.env.SVM_PRIVATE_KEY)) });
const pay = wrapFetchWithPayment(fetch, client);
// Not sure it's safe to pay? ToolVet checks it first for $0.005. Pay for that from a separate
// client: this one is capped at $0.1 per payment. GET https://toolvet.app/api/v1/check?url=https%3A%2F%2Ftravel.brij.fi%2Fair%2Fsearch&method=POST
const res = await pay("https://travel.brij.fi/air/search", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
"adults": 1,
"cabin_class": "economy",
"depart_date": "2026-06-10",
"destination_iata": "LIS",
"origin_iata": "MAD"
}),
});
console.log(res.status, await res.text());Python: pay and call
# pip install "x402[requests,svm]"
import os
from x402 import x402ClientSync
from x402.http.clients import x402_requests
from x402.mechanisms.svm import KeypairSigner
from x402.mechanisms.svm.exact.register import register_exact_svm_client
# Pays at most $0.1 per call.
client = x402ClientSync().set_spend_controls({"max_amount_per_payment": "$0.1"})
register_exact_svm_client(client, KeypairSigner.from_base58(os.environ["SVM_PRIVATE_KEY"]))
with x402_requests(client) as session:
res = session.post(
"https://travel.brij.fi/air/search",
json={
"adults": 1,
"cabin_class": "economy",
"depart_date": "2026-06-10",
"destination_iata": "LIS",
"origin_iata": "MAD",
},
)
print(res.status_code, res.text)Security scan
No findings
We scan names, descriptions and tool definitions for hidden instructions and other prompt-injection patterns.
Recent checks
| When | Result | HTTP | Time | Price |
|---|---|---|---|---|
| 4 h ago | Passed | 402 | 198 ms | $0.1 |
| 8 h ago | Passed | 402 | 189 ms | $0.1 |
| 12 h ago | Passed | 402 | 235 ms | $0.1 |
| 16 h ago | Passed | 402 | 280 ms | $0.1 |
| 20 h ago | Passed | 402 | 249 ms | $0.1 |
Show 10 older checks
| 24 h ago | Passed | 402 | 221 ms | $0.1 |
| 28 h ago | Passed | 402 | 202 ms | $0.1 |
| 32 h ago | Passed | 402 | 223 ms | $0.1 |
| 36 h ago | Passed | 402 | 220 ms | $0.1 |
| 40 h ago | Passed | 402 | 230 ms | $0.1 |
| 44 h ago | Passed | 402 | 237 ms | $0.1 |
| 2 days ago | Passed | 402 | 252 ms | $0.1 |
| 2 days ago | Passed | 402 | 201 ms | $0.1 |
| 2 days ago | Passed | 402 | 198 ms | $0.1 |
| 3 days ago | Passed | 402 | 238 ms | $0.1 |