# Brij Air Offer Details

> Brij Air Offer Details is a paid API for AI agents from travel.brij.fi, paid per call via x402, $0.01/call, status unknown (last checked 2026-10-12).

Re-fetches a flight offer from the original supplier to return the current price, expiry, available ancillary services (bags), and the full fare-brand menu for that flight.

## Facts

- Endpoint: POST https://travel.brij.fi/air/offer-details?utm_source=zero.xyz
- Price: $0.01/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-12
- Activations on Zero: 0
- Tags: x402, shopping
- Canonical page: https://www.zero.xyz/c/brij-air-offer-details-ead5869c
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_63gTPzhWMmSIGUZ44aH-b

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability brij-air-offer-details-ead5869c -d '<json body>'
```

Example prompt: Before I book that Madrid to Lisbon flight, can you refresh the offer with ID fastbooking:off_0000B5xGbDG4ifAoeDTtG9 to confirm the current price, when it expires, and show me all available fare brands and what checked bag options I can add?

## When to prefer this

Use this endpoint immediately before booking a flight to confirm the offer is still valid, get the live price, and enumerate all fare brands and ancillary options. Essential when you want to let the user pick a different fare tier (e.g. Flex instead of Basic) or add checked bags before calling POST /air/intents. Also use it when search results are stale or when you need the full fare menu that search may have omitted.

## Known failure modes

- Offer expired or no longer available at the supplier — returns error indicating the offer is stale
- Invalid or malformed offer_id — returns validation error
- Supplier is temporarily unreachable — timeout or upstream error
- Browser-tier offers (trip.com, ryanair) may take longer and cost $0.10 due to real browser session requirement
- Payment not included or insufficient — returns 402 Payment Required with applicable price quoted

## How this service works

Paid x402 endpoint: $0.01 USDC for fastbooking: offers, $0.10 USDC for offers from a browser tier (trip.com:, ryanair:) — reading their fare menu costs a real browser session at the supplier — the PAYMENT-REQUIRED challenge always quotes the applicable price.

fastbooking: offers — re-fetches the offer from the flight provider and returns it in the same shape as search results, with CURRENT price and expires_at, plus available_services: the purchasable extras (checked bags with weight limits and prices) on that exact fare. fare_options lists EVERY fare of this flight (same aircraft, every brand: Basic, Standard, Flex…), fresh from the supplier and price-ascending, each with its own bookable offer_id — including fares the search left out of its page. Pick the row you want and pass its offer_id to POST /air/intents.

browser-tier offers (trip.com:, ryanair:) — return the offer with fare_options filled from the supplier's own fare menu: per fare, the price, cabin, seats_left, and conditions[] (the supplier's verbatim wording for baggage allowances and refund policy — {type, text} pairs such as CARRY_ON, CONSIGN, UN_REFUND). Each fare row carries its own bookable offer_id ('<tier>:<flight>##<n>', e.g. 'trip.com:2026-11-07T20:35|2026-11-07T21:55|FR##1') and fare_index: create the intent on that offer_id to book THAT fare - the escrow prices at the fare, and the fulfiller selects the same menu index at the supplier. The fare menu must be fresh (re-drill after ~30 min: 409 fare_menu_expired). Expect 20-45s on a cold read; 202 fares_pending means the menu is still being fetched and nothing was charged — wait for the Retry-After header (15s) and send the same request again: it returns the finished result. Do not treat a 202 as the offer. Results are cached ~5 min per offer_id, so repeats are instant and free of supplier load.

Use it to (1) answer "how much is an extra bag on this fare?" or "is this browser-tier fare refundable?" — the ancillary/conditions questions search results cannot answer — and (2) revalidate a single offer minutes after a search, which is cheaper and quota-friendlier than re-searching.

A stale or unknown offer_id returns 404 and the payment is never settled: refusals cost nothing. Offers expire roughly 20-30 minutes after search; on 404, re-search.

Services are informational only: this API books the fare as-is and cannot add services to the order.

## Output

Returns the refreshed offer object with current total price, expires_at timestamp, available_services (purchasable extras such as checked bags with weight limits and prices), and fare_options — the full fare-brand menu for that specific flight from the supplier, price-ascending, each with its own bookable offer_id, cabin class, seats_left, and conditions.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "required": [
  "offer_id"
 ],
 "properties": {
  "offer_id": {
   "type": "string",
   "example": "fastbooking:off_0000000000000000000000",
   "description": "id from POST /air/search."
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "object",
 "required": [
  "offer",
  "available_services"
 ],
 "properties": {
  "offer": {
   "allOf": [
    {
     "type": "object",
     "required": [
      "id",
      "owner_name",
      "origin_iata",
      "destination_iata",
      "departing_at",
      "arriving_at",
      "origin_time_zone",
      "destination_time_zone",
      "stops",
      "technical_stops",
      "duration",
      "comparison_key",
      "fare_brand_name",
      "cabin_class",
      "checked_bags_included",
      "carry_on_bags_included",
      "conditions",
      "slices",
      "total_emissions_kg",
      "identity_documents_required",
      "total_amount",
      "total_amount_decimal",
      "total_currency",
      "requires_instant_payment"
     ],
     "properties": {
      "id": {
       "type": "string",
       "example": "fastbooking:off_0000B5xGbDG4ifAoeDTtG9"
      },
      "stops": {
       "type": "integer",
       "example": 1,
       "description": "Number of connections. 0 means a direct flight."
      },
      "slices": {
       "type": "array",
       "items": {
        "type": "object",
        "required": [
         "origin_iata",
         "destination_iata",
         "departing_at",
         "arriving_at",
         "origin_time_zone",
         "destination_time_zone",
         "stops",
         "segments"
        ],
        "properties": {
         "stops": {
          "type": "integer"
         },
         "duration": {
          "type": "string",
          "example": "PT1H15M"
         },
         "segments": {
          "type": "array",
          "items": {
           "$ref": "#/components/schemas/OfferSegment"
          }
         },
         "arriving_at": {
          "type": "string",
          "example": "2026-08-07T11:35:00"
         },
         "origin_iata": {
          "type": "string",
          "example": "MAD"
         },
         "departing_at": {
          "type": "string",
          "example": "2026-08-07T10:20:00",
          "description": "Airport-local, no UTC offset."
         },
         "fare_brand_name": {
          "type": "string"
         },
         "technical_stops": {
          "type": "integer"
         },
         "destination_iata": {
          "type": "string",
          "example": "LIS"
         },
         "origin_time_zone": {
          "type": "string",
          "example": "Europe/Madrid"
         },
         "checked_bags_included": {
          "type": "integer",
          "nullable": true,
          "desc
… (truncated)
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/brij-air-offer-details-ead5869c/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from travel.brij.fi](https://www.zero.xyz/host/travel.brij.fi/llms.txt)
