Developer Docs
REST + ON-CHAIN · NO KEY FOR DATASET PURCHASES · PREPAID KEY FOR METERED CALLSBuy API access with nothing but a wallet: quote → on-chain payment → claim. A subscription returns an access token at claim time; per-call metering issues a key after prepayment. Member accounts are optional - they keep your history - and AI agents need none.
Simulator settlement rules (prediction markets, parametric covers) live at weatherfi.io/docs. The former API host weathermarket.ai keeps answering until 2027-09-30 with a Deprecation header; new integrations should use this host.
Which product do I need?
These are three different things. Buying one does not give you the others.
| I want to… | Buy | Credential | Call |
|---|---|---|---|
| Settle a contract on what the weather was | Subscription history export included in the subscription · the days accumulated so far, as CSV | wdm_sub_… | GET /api/v1/sub/history?city=&format=csv |
| Read current values from my app, continuously | Live API subscription 25 USD / 30 days · 200 / year, paid in XRP · unlimited calls | wdm_sub_… | Authorization: Bearer GET /api/v1/sub/live?city= |
| Look something up occasionally, no commitment | Metered API 0.04 USD per call (1 credit) · no term · top up from 4 USD in XRP (= 100 credits) | wdm_key_… | x-api-key GET /api/agent/oracle?city= |
The prefix tells you where a credential belongs. Sending a wdm_sub_ token as x-api-key returns 401, and vice versa. Past roughly 5,000 calls a year the subscription costs less than metering; below that, metering does.
What the free tier gives you
The present is free. Everything accumulated is paid. Nothing here needs an account - a subscription token or a metered key on the same request opens the rest.
| What | Free | Paid |
|---|---|---|
| Current consensus for a named city | Yes - /api/v1/index?city=, up to 120 requests an hour | Unlimited, with per-source readings, corroboration and the determination |
| Forecast | The next 3 days - /api/v1/forecast?city= (3-day forecast) | 16 days plus hourly |
| Consensus history, per-source raw readings, 5-minute observations, snapshot bytes | No - 402 with payment instructions | Subscription: unlimited for the cities bought. Metered key: one credit (0.04 USD) per call - the form for republishing to your own customers |
| Snapshot hashes and anchor transactions | Yes - /api/v1/index/snapshots | Same, plus the canonical bytes (metered key) |
| Over the hourly budget | up to 120: served · 120 – 600: 429 with Retry-After to the top of the hour · over 600: 429 for 15 minutes, then an hour, then six. whatToBuy in the body. | Never rate-limited |
The rule that turns eleven feeds into one number and one verdict is proprietary. What is published is that it exists, that it does not change between runs, and that every run is hash-anchored on-chain. Free responses carry a freeTier block saying what is withheld; paid responses carry access.
Determinations - a verdict, not a number
Open a condition and receive one of three answers after the hour passes: met, not_met or withheld, each with a report of the reasons. Withheld means the hour cannot bear a settlement - observations were split, too few sources contributed, or no run exists. It is a result, not a loss for either side.
POST /api/v1/determinations
x-api-key: wdm_key_… # metered: charged per determination (price in the 402)
# or Authorization: Bearer wdm_sub_… # subscription covering the city: included
{ "city": "seoul", "metric": "temp", "op": "gte", "threshold": 35,
"targetHour": "2026-08-15T14:00:00Z", "label": "heat contract #42" }
→ 201 { "id": "…", "status": "open", "condition": {…}, "next": "Resolves after … on the next hourly run" }
GET /api/v1/determinations/{id} # same credential
→ { "status": "resolved", "outcome": "met",
"report": { "reason": "Consensus temperature at the target hour was 35.4°C; the condition was at or above 35°C. 2 independent observation(s) supported the consensus and 0 disagreed; 11 sources contributed and 1 outlier(s) were excluded.",
"value": 35.4, "verdict": "verified", "agree": 2, "disagree": 0, "nSources": 11, "excluded": 1 } }Metrics: temp (°C), humi (%), wind (m/s), rain (mm). Operators: gt, gte, lt, lte. The target hour is rounded down to the UTC hour and must be within 90 days. Without a credential the POST answers 402 with the price and the top-up flow - which is how an autonomous agent opens and pays for a determination on its own. The report explains the outcome; it does not disclose the rule (terms 7-b).
Versioning & machine-readable spec
Every path below is also served under /api/v1/ - the same handler behind a versioned URL. New integrations should use it, so a future breaking change can ship as v2 without moving anyone. The unversioned form keeps working.
Buying and managing access is at /api-access - subscription endpoints with revocable tokens, or a prepaid per-call API key. Both are paid in XRP on the XRP Ledger and the paying account is the credential, so there is no account to create. Every quote carries an xrpl block with the destination, the DestinationTag and the exact drops; the accounts are published on the Technical Proof page. If the block is missing the XRP/USD rate could not be read - request the quote again.
OpenAPI 3.1: /openapi.json. It is generated from the same list that renders this table, so the two cannot drift. Paths, methods, parameters and auth schemes are covered; response bodies are shown as worked examples below rather than as schemas, because a schema we could not keep current would be worse than none.
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/catalog | City catalog - continents › countries › cities, sources & attribution |
| GET | /api/cities | Flat city list with product availability, plus the current price table (1 USD for a day, 25 for 30 days, 200 for a year, paid in XRP; any other length at the daily rate). `station` carries the city's METAR station with its IANA timezone, `effectiveFrom` (the first date that station has been the city's reference), `history` (every earlier mapping with its dates) and `planned` (an announced change that has not taken effect yet). `name` is English; `nameKo` carries the Korean name. `nameEn` is retained as a duplicate of `name` and is deprecated |
| GET | /api/quote | Quote + quoteId (10 min TTL). Start within the next 90 days, run up to 365 days from that start. Pass `cities=a,b,c` instead of `city` for a bundle settled in one transaction |
| POST | /api/purchases/claim | { txHash, quoteId } → on-chain verification → a subscription certificate with a one-time `accessToken`. Send that token as `Authorization: Bearer`; the purchase ID is an identifier, not a credential. **Datasets are no longer sold** - the branch that returns a delivery receipt exists only for purchases made before the product was withdrawn, and those still download from /api/v1/download. What replaces it: a subscription serves values live for its term, and the days accumulated so far come as CSV from /api/v1/sub/history?format=csv |
| GET | /api/purchases | Purchase history via wallet signature (free re-download). Auth: Wallet signature in headers: x-wallet-address + x-wallet-ts + x-wallet-signature |
| POST | /api/purchases/{purchaseId}/token | Mint a new download access token. Requires a signature from the purchasing wallet (x-wallet-address, x-wallet-ts, x-wallet-signature headers) or the session of the account that bought it - the purchase ID alone is not enough. The token is returned once and only its hash is stored; issuing a new one does not revoke existing tokens |
| GET | /api/download/{purchaseId} | **Retired product - existing purchases only.** Datasets are no longer sold; this path serves purchases made before withdrawal and is kept so that data already paid for is not lost. Available once the purchased period has ended - 425 with an `availableFrom` date before that. Hourly is the unit: one purchased day is 24 rows at UTC hours. Requires a credential (access token, wallet signature, or the session that bought it). For current data, buy a subscription and use /api/v1/sub/live, or per-call metering. |
| GET | /api/download/{purchaseId}/settlement | Per-metric settlement eligibility for every hour of the purchase. The single settlementEligible flag goes false when any one metric falls outside tolerance - and 23.7% of measurement rejections are a wind disagreement alone - so a contract settling on rain or temperature would lose hours that are fine for it. This sits beside the dataset rather than inside it: dataset columns feed the SHA-256, and adding one would change the bytes of purchases already made. Same credential and same delivery gate as the download. Auth: Same as /api/download - token, wallet signature or session |
| GET/POST | /api/agent/topup | Prepaid per-call metering (HTTP 402; the same 402 also carries an x402 v2 PAYMENT-REQUIRED header for pay-per-call on the XRP Ledger): GET payment info (XRP destination, DestinationTag 402, rate) · POST { txHash, address, ts, sig, pubKey } after an XRP payment → credits + API key |
| GET | /api/agent/oracle | Metered call (0.04 USD, paid in XRP): consensus index + verdict + rain Y/N; 402 with payment info when drained. Auth: x-api-key header from /api/agent/topup |
| GET | /api/index | Public oracle feed. Free tier: the current consensus value and indices for the city you name (a 10-city sample without `city`), up to 120 requests an hour, then 429 with Retry-After. Free rows carry `index`, `wdi`, `tdi` only. With a subscription token or metered key on the same request the rows also carry per-source readings with observation times, outliers, corroboration counts, the measurement-only figure and the cross-check determination (`verdict`, `settlementEligible`, `settlementReason`, `settlementByMetric`). The consensus rule is proprietary; every run is hash-anchored on-chain |
| GET | /api/forecast | Daily forecast. Free tier: the next 3 days for the city you name. With a subscription token or metered key: the full 16 days plus the hourly forecast. Not metered - forecast is not accumulated data |
| POST/GET | /api/determinations | Open a determination (POST) - a verdict on a condition you set: { city, metric: temp|humi|wind|rain, op: gt|gte|lt|lte, threshold, targetHour, label? }. After the target hour the next run resolves it to met, not_met or withheld with a report of the reasons. Included with a subscription covering the city; otherwise paid from metered credits (price in the 402). Signed-in members with a linked wallet pay from the same credits on /determinations. GET lists the determinations opened with the same credential or session. Auth: x-api-key (metered, charged per determination) or Authorization: Bearer <accessToken> (subscription covering the city) |
| GET | /api/determinations/{id} | One determination: status, outcome (met · not_met · withheld) and the report - consensus value, condition, supporting and disagreeing observation counts, contributing and excluded source counts, reason. The rule that produced it is not disclosed. Auth: x-api-key or Authorization: Bearer <accessToken> - the credential it was opened with |
| GET | /api/sandbox/quote | Sandbox quote - same shape, same validation and the same live price table as /api/quote, but nothing is written and no chain is involved. Exists because trying the flow used to cost real USDT and gas, which is a poor reason not to integrate. It cannot serve real data; that is the point, not a limitation |
| POST | /api/sandbox/claim | Sandbox claim - { quoteId, txHash }. The hash is only checked for shape; no chain call is made. The response lists differencesFromLive so you do not build against behaviour the real path does not have |
| GET | /api/sandbox/download/{id} | Sandbox dataset - synthetic hourly rows, deterministic for a given city and date, with verdicts mixed to match the real distribution measured on 2026-08-06 (71% verified) so your settlement branch gets exercised - the live figure moves, and /api/v1/quality is what reports it now. Applies the same 425 delivery gate as the live download |
| GET | /api/quality | Per-city settlement quality - the share of hours over the last 7 and 30 days whose verdict was 'verified', with a per-verdict breakdown and an A/B/C grade. Use this to see how much of a period you are about to buy would actually be settle-eligible; the ratio varies a lot by city because the measurement network around each one does |
| GET | /api/index/history | Consensus and WDI/TDI time series per collection run. Paid: subscription (unlimited for covered cities) or metered key (one credit per call - the form for republishing to your own customers). 402 without a credential. Auth: Authorization: Bearer <accessToken> (subscription) or x-api-key (metered, 1 credit per call) |
| GET | /api/index/sources | Per-source raw readings behind each run's consensus, with the outliers that were excluded. Paid, same credentials as history. The rule that decides exclusion is not returned. Auth: Authorization: Bearer <accessToken> (subscription) or x-api-key (metered, 1 credit per call) |
| GET | /api/realtime | 5-minute METAR observation records (7-day window, paginated). Paid, same credentials as history. Auth: Authorization: Bearer <accessToken> (subscription) or x-api-key (metered, 1 credit per call) |
| GET | /api/index/snapshots | Snapshot list with the anchor transactions on each ledger. Pass `sha256` (or `runId`) to look up one run instead of the recent list - a settlement contract holding only `DeterminationRegistry.determinations(h).snapshotSha256` needs this to find the XRPL transaction it must attest before `isSettlementGrade` can turn true |
| GET | /api/index/snapshot/{runId} | Canonical snapshot bytes - SHA-256 matches the on-chain anchor. Paid: the snapshot covers every city, so a metered key (one credit) or a subscription covering the whole catalogue. Without a credential the 402 still carries sha256 and the anchor tx, so the commitment is checkable by anyone. Auth: x-api-key (metered, 1 credit per call) |
| GET | /api/sub/live | Subscriber live index + verdict oracle. One key opens every city the paying wallet subscribes to - name the city with ?city=. Buying another city adds it to the same key with no new credential. Auth: Authorization: Bearer <accessToken> |
| GET | /api/sub/forecast | Subscriber forecast (Open-Meteo + KWeather, nSources per row), any covered city. tz=station re-cuts the daily rows on the station's local calendar day and adds a local time to every hourly row. Auth: Authorization: Bearer <accessToken> |
| GET | /api/sub/history | Subscriber history within the subscribed window, any covered city. format=csv returns a file. tz=station re-cuts the rows on the station's local calendar day (daylight saving applied) with UTC bounds per row. Auth: Authorization: Bearer <accessToken> |
| GET | /api/metar-watch/report | Public, free. How the METAR feed prediction markets settle on actually behaves, measured every minute: per station the delay from observation to NOAA receipt, late reports, silent stretches, and reports corrected after publication (original text kept). Our own watcher's outages are reported and excluded |
| GET | /api/forecast-watch/report | Public, free. Forecast Watch: each weather model's own forecast for a station's local day, archived once a day 1 to 7 days ahead (ECMWF, NOAA GFS, DWD ICON, UKMO, Météo-France, JMA, ECCC GEM and the Open-Meteo blend) scored against the anchored station record once the day is final and settleable. Per source and lead day: MAE and bias of the daily high and low (°C), share within 1/2 °C, rain yes/no hit rate; per station the next-day daily-high MAE by source and the days each source was scored on. WeatherNext 3 is listed as pending until its data access is granted |
| GET | /api/station/{icao}/daily/record | The canonical bytes of a station day's record (every METAR text, extremes, finality reasons; keys sorted, no whitespace). For an anchored day these are the exact bytes whose SHA-256 was written to SnapshotAnchor on Flare: hash the body, compare with X-Record-Sha256, and call isAnchored(sha256) on-chain to verify without us. Paid, same credentials as history. Auth: Authorization: Bearer <accessToken> (subscription covering the station's city) or x-api-key (metered, 1 credit per call) |
| GET | /api/station/{icao}/observations | The station's METAR observations as received - raw text, observation time in UTC and station-local time, derived temperature/dewpoint/humidity/wind and whether precipitation was reported. from/to are station-local dates. Paid, same credentials as history. Auth: Authorization: Bearer <accessToken> (subscription covering the station's city) or x-api-key (metered, 1 credit per call) |
| GET | /api/station/{icao}/daily | One station-local calendar day (local midnight to midnight, daylight saving applied): high and low with the observation that produced each, wind max/mean, humidity mean, precipitation-reported count, the exact UTC window, and every observation of the day. finality says whether the day is open / provisional / final (3-hour correction hold after local midnight) and settleable (final with no report gap beyond the station's normal interval + 30 min); revision, lastChangedAt and corrections make any change after first publication detectable; anchor carries the Flare SnapshotAnchor transaction once the final record is written on-chain. values.metarDerived and values.nwsOfficial sit side by side (the NWS CLI side is null until ingestion; official.status says so). qc attaches per-report quality flags (good / suspect / bad with reasons: physical limits, dewpoint above temperature, temperature step, persistence) beside the record without changing its bytes, flags the reports behind the extremes, and gives the extremes excluding bad reports. Paid, same credentials as history. Auth: Authorization: Bearer <accessToken> (subscription covering the station's city) or x-api-key (metered, 1 credit per call) |
| GET | /api/station/{icao}/days | One row per station-local calendar day over a range (up to 62 days): the same extremes, finality, revision, anchor status and official.status as /daily, without the per-report lists, plus a summary with the period's highest tmax and lowest tmin, the days that are not final or not settleable, and the days whose extremes came from a suspect or bad report (qc per row). One call for a month market; settle only when summary.allSettleable is true. Paid, same credentials as history. Auth: Authorization: Bearer <accessToken> (subscription covering the station's city) or x-api-key (metered, 1 credit per call) |
| GET | /api/sub/{purchaseId}/live | Same data, addressed by purchase. Kept for existing integrations - prefer /api/sub/live. Auth: Authorization: Bearer <accessToken>, or wallet signature (x-wallet-address + x-wallet-ts + x-wallet-signature headers) |
| GET | /api/sub/{purchaseId}/forecast | Same data, addressed by purchase - prefer /api/sub/forecast. Auth: Authorization: Bearer <accessToken>, or wallet signature |
| GET | /api/sub/{purchaseId}/history | Same data, addressed by purchase - prefer /api/sub/history. Auth: Authorization: Bearer <accessToken>, or wallet signature |
| POST/GET/DELETE | /api/sub/{purchaseId}/token | Issue, list and revoke subscription access tokens. The plaintext is returned once; only its SHA-256 is stored. A token minted from any active subscription opens every city that wallet subscribes to. Auth: Wallet signature, or the session of the account that made the purchase - a token cannot mint another. Comp subscriptions have no wallet, so the session is their only path |
| GET | /api/health | Public: overall status, data age against the expected hourly interval, low-consensus city count, anchoring backlog, and whether payment is operational. 503 when unhealthy. Deployment identifiers, transaction hashes and internal remediation steps are returned only with an admin credential - a status endpoint should say whether the service works, not describe how it is built |
| POST | /api/mcp | MCP server (Streamable HTTP). Free read-only tools: list_cities, get_consensus_index, get_source_breakdown, get_forecast, verify_snapshot, get_pricing |
What runs where
PAYMENT · ANCHOR · PROOF · VERDICT| layer | ledger | network | what it does | status |
|---|---|---|---|---|
| anchor | BNB Chain | mainnet (56) | Legacy (first generation, 2026-07-25 to 2026-09-23): hourly snapshot hash as an IndexAnchored event; no new anchors, the 1,452 written remain verifiable - since 2026-09-23 the anchor of record is SnapshotAnchor on Flare 0x0c5FaC0a9304D52Cc3628B8D279a59a8C7d480d7 | LEGACY |
| payment | XRP Ledger | mainnet | Subscription paid in native XRP, priced from the FTSOv2 XRP/USD feed when the quote is issued; bound to the quote by a DestinationTag and verified against the ledger rMgtvhe5n8h1thkGsfz5q2F6WmssuxXuCn | LIVE |
| anchor | XRP Ledger | mainnet | Legacy (v2, until 2026-09-23): snapshot hash in the memo of a 1-drop payment; no new anchors, the 994 written remain verifiable rarEpetXGmEzLgZ8vZQz3Ntk1DzcfRL9K3 | LEGACY |
| anchor | Flare | mainnet (14) | Every run's snapshot hash written directly on Flare (v3 anchor of record); DeterminationRegistry reads it 0x2B59812947B48B5988FaA805a9514a5162415091 | LIVE |
| anchor-proof | Flare | mainnet (14) | Legacy (v2): proves an XRPL memo anchor on chain through an FDC XRPPayment attestation - kept for the anchors written before 2026-09-23 0x59cEB96Bc78B9f6c7a5EF48987Fe8aB6248CBE3A | LEGACY |
| verdict | Flare | mainnet (14) | Resolved verdicts published for settlement contracts to read; settlement-grade when the backing snapshot is anchored on SnapshotAnchor 0x0c5FaC0a9304D52Cc3628B8D279a59a8C7d480d7 | LIVE |
| payment | Flare | Coston2 (114) | Payment in native FLR, priced at the moment of payment from the FTSOv2 FLR/USD feed 0x8D0f464ed5F332ac726e084C5ebC620Cf055d4Ff | TESTNET |
| confidential | Flare | Coston2 (114) | Accepts a TEE-signed result from a Flare Confidential Compute extension after verifying the signature chain 0xef9374B90ecB8a70891a55F503441E8c4Ae346BD | TESTNET |
| blind | Flare | Coston2 (114) | Blind settlement: condition commitment, one-bit outcome and a sealed report - no threshold or index on chain - | NOT DEPLOYED |
Addresses and XRPL accounts are published on the Technical Proof page, so you can check this table against the ledgers rather than trusting it.
Agent flow
QUOTE → PAY → CLAIM · OR TOP-UP → METERED CALLS// ── A. Subscription or dataset purchase (single or bundle) - no signup, no API key (xrpl.js)
// Dates are computed, not pasted: a hardcoded range goes stale and the request
// starts failing the day it falls outside the allowed window.
const day = (n) => new Date(Date.now() + n * 86400000).toISOString().slice(0, 10);
const from = day(0); // start today, or any day within the next 90
const to = day(364); // up to 365 days from that start
const quote = await (await fetch(
BASE + `/api/quote?cities=seoul,tokyo,london&from=${from}&to=${to}`
)).json();
// quote.priceUsdt = the USD price; quote.xrpl = how to pay it in XRP:
// { destination, destinationTag, amount: { drops }, rate: { usdPerXrp, source } }
// The drops are fixed for ten minutes at the FTSOv2 XRP/USD rate - send at least that many.
// Never precompute the price - 30- and 365-day terms are discounted, so days x rate is wrong.
const tx = await client.submitAndWait(wallet.sign(await client.autofill({
TransactionType: "Payment",
Account: wallet.address,
Destination: quote.xrpl.destination,
DestinationTag: quote.xrpl.destinationTag, // binds the payment to this quote - required
Amount: quote.xrpl.amount.drops,
})).tx_blob);
const claim = await (await fetch(BASE + "/api/purchases/claim", {
method: "POST", headers: { "Content-Type": "application/json" },
body: JSON.stringify({ txHash: tx.result.hash, quoteId: quote.quoteId, chain: "xrpl" }),
})).json();
// subscription: claim.accessToken (wdm_sub_…) → Authorization: Bearer on /api/v1/sub/live?city=
// dataset: claim.data.cities[slug].rows: date, tavg, tmax, tmin, precip, rain, humidity, wind, verdict
// ── B. Prepaid per-call metering (HTTP 402) - 0.04 USD per oracle call, paid in XRP
const { payment } = await (await fetch(BASE + "/api/agent/topup")).json();
// payment = { destination, destinationTag: 402, pricePerCallUsd, minTopupUsd, minTopupXrp, rate }
// Buy ~1,000 calls at the current rate - do not hardcode the amount.
const xrp = (1000 * Number(payment.pricePerCallUsd) / payment.rate.usdPerXrp).toFixed(6);
const topup = await client.submitAndWait(wallet.sign(await client.autofill({
TransactionType: "Payment", Account: wallet.address,
Destination: payment.destination, DestinationTag: payment.destinationTag,
Amount: xrpToDrops(xrp),
})).tx_blob);
// Prove the sending account is yours: sign the auth message with the account key.
const ts = String(Date.now());
const msgHex = Buffer.from(`WeatherMarket auth ${wallet.address} ${ts}`, "utf8").toString("hex");
const { apiKey } = await (await fetch(BASE + "/api/agent/topup", {
method: "POST", headers: { "Content-Type": "application/json" },
body: JSON.stringify({ txHash: topup.result.hash, address: wallet.address, ts,
sig: sign(msgHex, wallet.privateKey), pubKey: wallet.publicKey }), // ripple-keypairs
})).json();
const r = await (await fetch(BASE + "/api/agent/oracle?city=seoul", {
headers: { "x-api-key": apiKey },
})).json(); // { index, wdi, tdi, rain, verdict, credits: { left } } - 402 when drainedVerification
Every dataset ships with a SHA-256 that reproduces on re-download. Every collection run's snapshot hash is anchored on a public ledger - fetch /api/index/snapshot/:runId, hash the bytes, and compare against the anchor: call SnapshotAnchor.isAnchored(sha256) on Flare, the anchor of record since 23 September 2026. Runs before that date also carry legacy anchors - the IndexAnchored event on BNB Chain and the memo of a 1-drop XRPL payment. /api/v1/index/snapshots lists every anchor per run, so check whichever you can verify - the hash is the same one either way. Trustless by construction. The accounts, the contract addresses and the FCC TEE signature chain are laid out on the Technical Proof page.
Licence & attribution
Buying grants a non-exclusive licence to use the data in your own product, commercially included, and to show it to your end users. Attribution is required wherever it is displayed: Powered by Weather Data Market, linked to this site. Every data response carries an attribution object with the exact text, the link, ready-to-paste markup, and any upstream source that needs its own credit.
Serving the data to your own front end through your own backend is fine. Offering it to third parties as a feed, API, dataset or bulk download is not, and neither is reselling it substantially as delivered under another brand. Analyses, indexes and forecasts you derive from it are yours. Data already received stays usable after a subscription ends.
Stuck on an integration, or seeing an endpoint behave unexpectedly? Write to admin@wellbianlabs.io. That reaches Wellbian Labs, which operates the platform and is the party you contract with, so contractual questions go to the same address - see section 16 of the terms.
Full text in section 7 of the terms.