A daily aircraft-registry snapshot is powerful evidence, but only if you are precise about what it proves.
The FAA publishes a releasable aircraft database and says the download is refreshed daily at about 11:30 p.m. Central. That makes it possible to retain a sequence of public observations over time rather than serving only the latest file. (FAA source)
The tempting conclusion is that a daily sequence gives you an exact ownership or registration timeline.
It does not.
What a retained snapshot can prove is narrower and more useful: a particular public state was present when that source snapshot was retrieved. Comparing accepted snapshots can then show that some retained field changed between observations.
That distinction is the foundation of the Grizzly Bulls registration history API.
Observation time is not effective time
Suppose an N-number appears with one registration status in Monday's accepted source and a different status in Tuesday's accepted source.
You can safely say:
- Grizzly Bulls observed the first status in the Monday snapshot.
- Grizzly Bulls observed the second status in the Tuesday snapshot.
- The observed public state changed between those two snapshots.
You generally cannot say, solely from those two observations:
- the legal change took effect at the Tuesday retrieval timestamp;
- the transaction occurred exactly between two scheduled download times;
- a certificate date is automatically the effective date of every related change; or
- a change first became true at the moment it first appeared in the downloadable source.
A source may contain a date that directly describes a specific legal or administrative event. When it does, that source-reported date can be preserved as its own field. But a retrieval timestamp should not be relabeled as an effective date merely because it is the first time the new state was observed.
This is why the public history contract separates observedAt from the nullable sourceEffectiveDate.
Daily copies are a wasteful history model
The simplest historical database design is to save a full copy of every registration every day.
That works, but it creates a large amount of duplication and makes it harder to distinguish "we observed the same state again" from "the state changed."
Our current model stores compact observed versions instead.
If a registration's retained semantic state is unchanged across successive accepted snapshots, the existing version's observation interval is extended. A new version begins only when the retained state changes.
Conceptually:
1Sep 20 snapshot: state A
2Sep 21 snapshot: state A
3Sep 22 snapshot: state A
4Sep 23 snapshot: state Bbecomes:
1version 1
2 observed from Sep 20
3 observed through Sep 22
4 state A
5
6version 2
7 observed from Sep 23
8 observed through Sep 23
9 state BThat preserves the evidence without pretending that three identical daily rows are three different historical states.
Versions and change events answer different questions
A version answers:
What public state did we retain during this observed interval?
A change event answers:
What kind of difference did we detect when a newly accepted snapshot was compared with the previous state?
The current public history model can represent events such as:
- registration added;
- registration removed;
- registration record changed;
- aircraft assignment changed;
- registration status changed;
- registrant representation changed;
- registrant PII withheld; and
- registrant PII released.
The event vocabulary is intentionally bounded.
For non-personal changes, events can identify reviewed field groups such as registration status, aircraft assignment, model codes, Mode S code, manufacture year, certificate dates, airworthiness date, and registrant type.
The event record does not publish old and new owner names or addresses.
That split lets an application build a timeline without turning the change log into a second store of sensitive personal data.
A changed field is not always a business event
A registry change event is evidence about the source state. It should not automatically be promoted into a stronger real-world claim.
For example, a changed registrant representation does not by itself prove:
- a beneficial ownership transfer;
- the economic terms of a sale;
- the date money changed hands;
- who ultimately controls an entity; or
- whether an aircraft was physically delivered.
Aircraft registration records are useful public evidence, but registration is not the same thing as beneficial economic ownership.
That is especially important for research products. "The FAA public registration changed" is a source-backed statement. "The aircraft was sold to this person on that date for this amount" requires additional evidence.
Source dates should stay source dates
The registry contains several date fields with their own meanings, including certificate issue, expiration, last activity, and airworthiness dates.
Those fields are useful, but they should not be repurposed merely to make a timeline look more precise.
Our rule is simple: populate an event-level effective date only when the source semantics directly support that event/date relationship. Otherwise the effective date remains null.
The retrieval timestamp still tells you something valuable. It says when Grizzly Bulls observed the new public state in an accepted source snapshot.
A precise uncertainty interval is often more honest than a false exact timestamp.
History can expose privacy mistakes that current-only APIs avoid
Historical retention creates another problem: a value that was public yesterday may no longer be public today.
The FAA currently provides a process under 49 U.S.C. § 44114(b) that allows eligible private aircraft owners to request that certain ownership information, such as names and addresses, be withheld from public dissemination. (FAA withholding guidance)
If a history system simply preserves every old public row forever, it can defeat the current source's withholding decision.
We do not allow that.
Current FAA non-release is authoritative for public historical PII. When the current public source stops releasing a matching sensitive field, retained historical values are scrubbed conservatively.
That includes fields such as:
- registrant names;
- street addresses;
- city/state/postal location data;
- county/country fields; and
- other-owner aliases.
The goal is not to guess why a value disappeared. A blank releasability-sensitive field means only that the current public source did not release that value.
Privacy suppression is intentionally irreversible for old observations
There is a subtle consequence to this policy.
Suppose an owner is public in January, withheld in February, and public again in March.
A naive history model might restore the January name after the March re-release because "it is public again."
Our model does not.
The February withholding causes the older retained sensitive value to be scrubbed. If the FAA later releases registrant information again, the March observation can contain the newly public data, but the older scrubbed January value is not reconstructed.
That makes the historical record less complete in one sense. It also prevents the history product from becoming a workaround for a period in which the current public source explicitly stopped releasing the information.
The event stream can still record a registrant_pii_withheld or registrant_pii_released transition without preserving the removed personal value inside the event itself.
Current reference data should not be projected backward
Another common historical mistake has nothing to do with privacy.
The FAA archive includes current aircraft and engine reference files. Those descriptions are useful for today's current lookup, but if the reference tables themselves are not historically versioned, today's description is not evidence about what the reference table said six months ago.
For that reason, our public current record can include current manufacturer/model and engine descriptions, while historical versions expose only the aircraft fields actually retained for that observation.
We do not decorate an old registration version with today's unversioned reference description and then present it as historical evidence.
This is a general temporal-data rule: current enrichment is not historical truth unless the enrichment source is versioned too.
Same-source reruns should not manufacture history
Scheduled data systems retry. Hosts restart. Jobs get triggered twice.
If the downloaded archive is byte-for-byte the same accepted source, a second run should not create a new historical fact merely because the ingestion process ran again.
Our pipeline retains the archive checksum and treats the current identical source as an idempotent no-op after validation.
That means history advances when source evidence advances, not when a scheduler fires.
Without that rule, operational noise can turn into fake historical density.
What an observed history API is good for
With these limitations in place, retained daily observations are still extremely useful.
They can support questions such as:
- What registration states has this N-number been observed in?
- When did Grizzly Bulls first and last observe each retained state?
- Did status, Mode S, certificate dates, aircraft assignment, or other non-personal fields change?
- Did the source stop releasing registrant PII?
- How many retained versions and change events exist?
- What source snapshot and archive hash support a particular observation?
Those are strong, auditable questions because they match the evidence the system actually retains.
The registration history API exposes versions and events as separately bounded pages so an application can consume the state history and change stream independently.
What the API should not claim
A daily registry history should not be described as:
- a complete legal ownership ledger;
- proof of beneficial ownership;
- exact transaction timing;
- a historical copy of every source field forever;
- a way to recover currently withheld personal data; or
- proof that today's reference descriptions were the descriptions shown in an older snapshot.
Those claims exceed the evidence.
The better product is explicit about uncertainty. It tells you exactly when the system observed a state, retains source provenance for that observation, records bounded changes, and leaves an effective date null when the source does not actually establish one.
That may sound less definitive than a perfectly clean ownership timeline. It is also much more defensible.
If you need the current registry record, start with the N-number lookup API. If you need the sequence of states Grizzly Bulls actually observed, use the registration history API.
