If you build airline retail or pricing systems, ATPCO fare filing isn’t “legacy noise”—it’s the rulebook most of the ecosystem still plays by. Even if you’re racing toward dynamic Offers & Orders, the filed world powers interline, agency distribution, and servicing. Understanding it well makes modernization safer and faster.

1) Why this still matters

Modern pitfall: jumping straight to dynamic pricing without a bridge to filed fares. You’ll ship faster—and break more—than you expect.

2) How fare data flows

  1. Authoring. Pricing/RM define base fares, attach rules and footnotes, and prepare batches.
  2. ATPCO processing & distribution. Validation, normalization, and distribution to subscribed systems (GDS, pricing engines, tax engines, data lakes). This is a source of timing/latency mismatch.
  3. Shopping & pricing. Engines combine itinerary + inventory (RBD) + your filed data to form priceable candidates.
  4. Ticketing & settlement. Fare basis, endorsements, amounts, and references make it onto the ticket/EMD and drive reissues, refunds, proration, and clearing.

Reality check: Every hop (authoring → ATPCO → cache → seller) is a chance for your price to drift from host inventory. Design for it.

3) The core building blocks

4) Rule categories (plain English)

Categories are just named chunks of logic. Here are the heavy hitters you’ll actually implement:

CatWhat it’s aboutWhat to watch for
1EligibilityPAX type, residency, corporate ID. Quick early filter.
2Day/TimeLocal time windows; time zones matter.
3SeasonalityTravel start windows; normalize to intervals.
4Flight ApplicationSpecific flights/equipment; match to schedules.
5Advance PurchaseBook-by dates; evaluate at quote and at ticketing.
6Minimum StayOften “Sat night” or X days.
7Maximum StayReturn time limits.
8StopoversCount/charges; interacts with Cat 12 surcharges.
9TransfersConnection limits; prunes awkward itineraries.
10CombinabilityHalf-round-trip and end-on-end logic; core to multi-fare trips.
12SurchargesRule-level fees (distinct from YQ/YR).
14Travel RestrictionsBlackouts, directional sequences.
15Sales RestrictionsPOS/POT; channel gating.
16PenaltiesChange/refund conditions (free text if not using 31/33).
17HIP/Mileage ExceptionsOverrides to higher-intermediate-point checks.
31Voluntary ChangesStructured change rules; newer, machine-friendly.
33Voluntary RefundsStructured refund rules; automates refunds.
25Fare By RuleProgrammatic transforms—discount/markup off bases.
35NegotiatedPrivate/net fares with access controls.

5) Footnotes, without the mystery

Footnotes are a scoping tool. A fare references a footnote code; that code maps to rows of category data that apply only when that footnote is present. The engine merges “base rule” + “footnote rows” before evaluation.

Tip: cache a compiled rule keyed by hash(ruleNumber + sortedFootnotes) to avoid re-merging on every quote.

6) Routing vs MPM (and construction)

Constructed pricing stitches fare halves (e.g., domestic add-on + international half). After construction, run HIP (Higher Intermediate Point) and circle trip checks so you don’t under-collect versus an intermediate city.

7) YQ/YR, Cat 12, and taxes

Rounding: Obey currency and market rounding rules; keep unrounded audit values.

8) A realistic pricing workflow

Input: O&D, dates, pax types, cabin, corp codes, itinerary shape

1. Get availability (RBD per segment).
2. Build candidate itineraries (time, connection, alliance constraints).
3. Fetch fare candidates by market/cabin/effective dates/POS.
4. Compile rules (base + footnotes) into a fast structure.
5. Fast filters: Cat 2/3/5/15 to shrink the set early.
6. Map itinerary to fare components; validate routing or MPM.
7. Deep checks: Cat 6/7, Cat 8/9, Cat 10, HIP/circle trip.
8. Add Cat 12 surcharges, then YQ/YR, then taxes via tax engine.
9. Normalize currency & rounding; emit a detailed pricing trace.

9) Keeping prices honest

10) Caching what actually helps

Cache compiled rules and light metadata, not whole priced itineraries. Invalidate by ATPCO deltas, expose dataset timestamps, and publish a “staleness” metric with each response.

11) Frequent failure modes

What goes wrongWhy it happensHow to prevent it
Quote ≠ ticketStale Cat 5 or closed RBD between stepsShort quote validity; reprice at commit; verify dataset version
Penalty confusionCat 16 free-text; partial Cat 31/33 adoptionPrefer structured rules; clear customer copy if parsed text is ambiguous
Under-collection on circlesSkipped HIP/circle trip logicAutomate tests on known tricky markets
Wrong taxes on edgesOutdated tax tables or stopover detection bugsAutomated diffs; timezone-aware stopover logic
Reload latency spikesMass recompiles in the hot pathJIT compile + LRU cache; pre-warm popular composites

12) Engineering patterns that work

12.1 Normalize your internal model

Fare { id, O, D, dir, fareBasis, primaryRBD, tariff, ruleNumber,
       effective, expire, travelStart[], travelEnd[], private, ccy, amount, ptcs[], footnotes[] }

CompiledRule { key, ruleNumber, footnoteSet[], categories{...}, provenance{versions...} }

Availability { segmentKey -> { RBD: seats, updatedAt } }

PricingTrace { itinerarySig, fareComponents[], appliedCats[], surcharges[], taxes[], datasetVersion }

12.2 Evaluation strategy

13) Bridging to Offers & Orders

14) Where continuous pricing fits

15) What to monitor

16) A short implementation checklist

17) Mini glossary

18) Sources & further reading

These are concept primers. For operational details, use your licensed documentation and data feeds.

19) Disclaimer

This article is for product and engineering orientation. It does not reproduce proprietary ATPCO specifications or paid datasets. Always validate against your airline’s licensed ATPCO/IATA documentation, local regulations, and internal revenue accounting policies.

Transparency note: AI assistance was used to draft and edit this article; all facts and recommendations were reviewed for accuracy and relevance before publication.

Back to all blogs

ATPCO fare filing illustration