Skip to content

Commit a259df8

Browse files
committed
Emphasize first-party oracle model throughout the book
Airnode is designed for API providers to operate their own nodes. The docs now consistently reinforce this, clarify the trust gap with third-party operators, and guide consumers to verify operator identity via DNS before trusting an airnode.
1 parent 2b0ca70 commit a259df8

7 files changed

Lines changed: 106 additions & 25 deletions

File tree

book/docs/concepts/endpoint-ids.md

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,17 @@ These fields do not affect the endpoint ID:
9292

9393
### Cross-operator comparability
9494

95-
When two independent operators serve the same API endpoint with the same parameters and encoding, they produce the same
96-
endpoint ID. On-chain contracts can verify that data from different airnodes refers to the same underlying data point
97-
without trusting a centralized registry.
95+
When two independent first-party operators serve the same API endpoint with the same parameters and encoding, they
96+
produce the same endpoint ID. On-chain contracts can verify that data from different airnodes refers to the same
97+
underlying data point without trusting a centralized registry.
9898

99-
This is how beacon aggregation works: multiple airnodes produce beacons for the same endpoint ID, and a data feed
100-
contract aggregates them into a single value. The endpoint ID is the common key.
99+
This is how beacon aggregation works: multiple first-party airnodes produce beacons for the same endpoint ID, and a data
100+
feed contract aggregates them into a single value. The endpoint ID is the common key.
101+
102+
Note that a matching endpoint ID proves two operators committed to the same API specification — it does not prove they
103+
are actually calling it. With first-party airnodes (where the API provider operates the node), this is inherently
104+
trustworthy. With third-party operators, a matching endpoint ID provides weaker guarantees because the operator could
105+
fabricate data while claiming to serve the specified API.
101106

102107
### TLS proof verification
103108

book/docs/consumers/getting-started.md

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,19 @@ curl http://airnode.example.com/health
2323

2424
Save the `airnode` address. You need it to verify signatures.
2525

26-
## Step 2: Find your endpoint ID
26+
## Step 2: Verify the operator
27+
28+
Before trusting an airnode, verify that it is operated by the API provider — not a third party. Use
29+
[DNS identity verification](/docs/security/identity-verification) (ERC-7529) to confirm the airnode address is
30+
associated with the API provider's domain. A first-party airnode (operated by the data source) provides the strongest
31+
trust guarantees. See the [Trust Model](/docs/security/trust-model) for why this matters.
32+
33+
## Step 3: Find your endpoint ID
2734

2835
The airnode operator provides the endpoint ID for each API route. It is a `bytes32` hash derived from the endpoint's OIS
2936
specification. The operator's documentation lists available endpoint IDs and their expected parameters.
3037

31-
## Step 3: Make a request
38+
## Step 4: Make a request
3239

3340
Call the endpoint with parameters in the JSON body.
3441

@@ -63,7 +70,7 @@ If the endpoint has no encoding configured, you get `rawData` instead of `data`:
6370
}
6471
```
6572

66-
## Step 4: Verify the signature
73+
## Step 5: Verify the signature
6774

6875
Recover the signer address and compare it to the airnode address from `/health`.
6976

@@ -99,7 +106,7 @@ const rawDataHash = keccak(toBytes(JSON.stringify(rawData)));
99106
// Use rawDataHash in place of `data` in the encodePacked call above
100107
```
101108

102-
## Step 5: Decode the data
109+
## Step 6: Decode the data
103110

104111
Encoded responses contain ABI-encoded values. Decode them with viem.
105112

@@ -120,7 +127,7 @@ Raw responses need no decoding. Access the JSON directly:
120127
const ethPrice = rawData.ethereum.usd; // 3842.17
121128
```
122129

123-
## Step 6: Submit on-chain (optional)
130+
## Step 7: Submit on-chain (optional)
124131

125132
Pass the signed data to an on-chain verifier contract. See [On-Chain Integration](/docs/consumers/on-chain) for contract
126133
examples using AirnodeVerifier (pull) and AirnodeDataFeed (push).

book/docs/guides/system-overview.md

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -85,20 +85,27 @@ No cache server or external infrastructure required. The airnode is the entire b
8585

8686
## Multi-operator setup
8787

88-
Multiple independent airnodes serve the same API data. A cache server aggregates their signed responses. Relayers read
89-
from the cache server and submit on-chain with quorum verification.
88+
Multiple independent first-party airnodes — each operated by a different API provider — serve comparable data. A cache
89+
server aggregates their signed responses. Relayers read from the cache server and submit on-chain with quorum
90+
verification.
9091

9192
```
92-
Airnode A ──┐
93-
Airnode B ──┼──▶ Cache Server ──▶ Relayer ──▶ On-chain Contract
94-
Airnode C ──┘
93+
Airnode A (Provider X) ──┐
94+
Airnode B (Provider Y) ──┼──▶ Cache Server ──▶ Relayer ──▶ On-chain Contract
95+
Airnode C (Provider Z) ──┘
9596
```
9697

9798
Use this when:
9899

99-
- You need redundancy across independent operators.
100-
- On-chain consumers require data signed by multiple sources (beacon sets / quorum).
100+
- You need redundancy across independent API providers.
101+
- On-chain consumers require data signed by multiple first-party sources (beacon sets / quorum).
101102
- You want to decouple airnode operators from gas payment and on-chain submission.
102103

103104
Each airnode produces its own beacon ID for the same endpoint. The cache server collects all of them. A relayer can
104105
aggregate them into a beacon set on-chain using median aggregation.
106+
107+
The trust value of a multi-operator setup comes from **independence at the source level**. Multiple first-party airnodes
108+
from different API providers (e.g., CoinGecko, CoinMarketCap, CryptoCompare each running their own airnode) provide
109+
genuine redundancy — an attacker would need to compromise multiple independent data sources. Multiple third-party
110+
operators calling the same API do not provide this property, since they all depend on the same upstream source and
111+
introduce the same intermediary trust assumptions.

book/docs/introduction.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ If you're building a smart contract, dApp, or AI agent that needs real-world dat
3232
cryptographic guarantees.
3333

3434
- **First-party data.** The API provider runs the Airnode and signs the data directly. No intermediary chain of oracles
35-
repackaging data — the signature traces back to the source. You can verify the provider's identity via DNS (ERC-7529).
35+
repackaging data — the signature traces back to the source. Verify that the airnode is operated by the API provider
36+
using [DNS identity verification](/docs/security/identity-verification) (ERC-7529) before trusting its data.
3637
- **Verifiable off-chain and on-chain.** Every response includes an EIP-191 signature. Verify it locally in your
3738
application or submit it to an on-chain verifier contract. The same signature works in both contexts.
3839
- **Standard HTTP interface.** No proprietary SDKs or oracle-specific protocols. Send a `POST` request, get signed JSON
@@ -41,8 +42,9 @@ cryptographic guarantees.
4142
choose the encoding at request time with `_type`, `_path`, and `_times` parameters.
4243
- **Multiple access models.** Free endpoints for public data, API keys for authenticated access, NFT-gated endpoints for
4344
token holders, or pay-per-request via x402. Use whatever fits your use case.
44-
- **Aggregation and quorum.** Multiple independent airnodes serving the same API produce the same endpoint ID. Collect
45-
signatures from several providers and submit them to a quorum verifier — no single provider can fabricate data.
45+
- **Aggregation and quorum.** Multiple first-party airnodes from different API providers serving comparable data produce
46+
the same endpoint ID. Collect signatures from several providers and submit them to a quorum verifier — no single
47+
provider can fabricate data.
4648

4749
## Core Flow
4850

book/docs/operators/index.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,16 @@ sidebar_label: Getting Started
88

99
Set up and run an Airnode in under 5 minutes.
1010

11+
## Who should run an Airnode
12+
13+
Airnode is designed for **API providers** to serve their own data on-chain. You should be the API provider or an
14+
authorized representative of the API provider. This is what makes Airnode a first-party oracle — the entity that
15+
controls the data source also controls the signing key.
16+
17+
If you are not the API provider, the trust properties change fundamentally. Consumers cannot verify that you are
18+
honestly relaying data from the upstream API, and DNS identity verification will only prove your domain — not the API
19+
provider's. See the [Trust Model](/docs/security/trust-model) for details.
20+
1121
## 1. Generate a key
1222

1323
```bash

book/docs/security/identity-verification.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,21 @@ who sets the TXT record is claiming: "I control this domain and I operate this a
118118
- **It composes with existing trust**: if you already trust CoinGecko's API, verifying that their airnode address
119119
resolves to their domain extends that trust to their on-chain oracle.
120120

121+
### First-party verification
122+
123+
DNS identity verification is most meaningful for **first-party airnodes** — where the API provider operates the node.
124+
When CoinGecko sets a DNS TXT record associating their airnode address with `api.coingecko.com`, consumers can verify
125+
that the data signer is the same entity that controls the data source. This is the strongest trust configuration.
126+
127+
A third-party operator can only verify their own domain. If `oracle-service.example.com` claims to serve CoinGecko data,
128+
DNS verification proves the operator controls `oracle-service.example.com` — not that CoinGecko authorized them or that
129+
the data is genuine. Consumers should always look for DNS verification against the **API provider's domain**, not the
130+
operator's domain.
131+
121132
What identity verification does **not** prove:
122133

123-
- That the airnode is serving correct data (the operator is still trusted to be honest).
134+
- That the airnode is serving correct data (with first-party operation, the provider's reputation is at stake; with
135+
third-party operation, this is unverifiable).
124136
- That the configuration hasn't changed (the operator can update their config at any time).
125137
- That the DNS record is current (records can be removed, so verify close to integration time).
126138

book/docs/security/trust-model.md

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,46 @@ sidebar_position: 1
77

88
Understanding what you are trusting when you consume data from an airnode.
99

10+
## First-party oracle model
11+
12+
Airnode is designed around the **first-party oracle** principle: the entity that operates the API also operates the
13+
airnode. When CoinGecko runs an airnode serving CoinGecko's API, the signature on every response traces directly back to
14+
the data source. There is no intermediary oracle network, no third-party relaying the data, no trust gap between the
15+
signer and the source.
16+
17+
This is important because it means the trust relationship is the same on-chain as it is off-chain. If you already trust
18+
CoinGecko's API for off-chain use, an airnode operated by CoinGecko extends that exact same trust on-chain. The
19+
signature is the API provider's signature.
20+
21+
### Why first-party matters
22+
23+
With a third-party oracle (someone other than the API provider running the node), consumers must trust that the operator:
24+
25+
- Is actually calling the API they claim and not fabricating or caching responses
26+
- Has legitimate access to the API and is not violating terms of service
27+
- Is not modifying, delaying, or selectively omitting data
28+
- Will keep the node running and the API credentials current
29+
30+
None of these properties can be verified on-chain today. The endpoint ID commits to *what* API should be called, but it
31+
does not prove the operator is actually calling it. DNS identity verification proves *who* controls a domain, but a
32+
third-party operator would only prove their own domain -- not the API provider's.
33+
34+
**First-party operation eliminates this entire class of trust assumptions.** The API provider has no incentive to
35+
fabricate responses to their own API, already has legitimate access, and controls the infrastructure end-to-end.
36+
37+
Consumers should prefer airnodes operated by the API provider and verify this via
38+
[DNS identity verification](/docs/security/identity-verification). If an airnode's identity cannot be traced to the API
39+
provider's domain, treat it with the same skepticism you would apply to any unverified data source.
40+
1041
## What you are trusting
1142

1243
### 1. The airnode operator is calling the API they claim
1344

1445
The endpoint ID is a specification-bound hash that commits to the API URL, path, method, parameters, and encoding rules.
1546
Two independent operators serving the same API with the same config produce the same endpoint ID. This is a verifiable
1647
commitment -- you can inspect the config and confirm the endpoint ID matches -- but it is not proof that the operator is
17-
actually running that config. Until TLS proofs mature, you trust the operator to be honest.
48+
actually running that config. With a first-party airnode, this is not a concern: the API provider has no reason to
49+
misrepresent calls to their own API. Until TLS proofs mature, third-party operators require out-of-band trust.
1850

1951
### 2. The airnode's private key is secure
2052

@@ -28,8 +60,8 @@ The first-party trust model means the API provider is already trusted. If you us
2860
trust CoinGecko. Airnode extends that trust on-chain -- the data is signed by the API provider's key, not by a
2961
third-party oracle network.
3062

31-
For higher assurance, use a quorum of multiple independent airnodes serving the same endpoint ID. An attacker would need
32-
to compromise a majority to manipulate the result.
63+
For higher assurance, use a quorum of multiple independent first-party airnodes -- each operated by a different API
64+
provider serving comparable data. An attacker would need to compromise a majority of providers to manipulate the result.
3365

3466
## How trust is established
3567

@@ -51,12 +83,18 @@ Multiple independent airnodes can serve the same endpoint ID. On-chain, you can
5183
sets (median of N independent values via AirnodeDataFeed). Off-chain, your client can query multiple airnodes and
5284
compare results. No single operator can manipulate the aggregated feed.
5385

54-
### Future: TLS proofs
86+
### Future: TLS proofs and third-party trust
5587

5688
TLS Notary (or zkTLS) can produce cryptographic proof that the data came from a specific HTTPS endpoint. This would
5789
eliminate the need to trust the operator's honesty -- the proof shows the data was not fabricated. When TLS proof
5890
technology matures, it can be integrated as a plugin or proof mode without changing the core architecture.
5991

92+
TLS proofs are particularly significant for third-party operators. Today, a third-party operator cannot prove they are
93+
actually calling the API they claim. With TLS proofs, the cryptographic proof itself demonstrates the data came from
94+
the API provider's HTTPS endpoint -- regardless of who operates the airnode. This could make third-party operation
95+
viable for use cases where the API provider does not want to run infrastructure, while still preserving verifiable
96+
data provenance. Until then, first-party operation remains the only trust model where the data source is guaranteed.
97+
6098
### Future: TEE attestation
6199

62100
Running the airnode in a Trusted Execution Environment (AWS Nitro Enclaves, Intel SGX, AMD SEV-SNP) produces attestation

0 commit comments

Comments
 (0)