Listing schema v0.1
The schema is the product. Whoever defines the listing schema owns the directory — so it's open, versioned, and documented here in full. Every field is something a buyer agent needs to decide and call; there are no human-only fields.
Design rules:
verification_status
is set by ExchangeRebel (see verification);
everything else is operator-declared and spot-checked. Schemas are versioned
with semver; v0.x may add optional fields, never rename or remove.Fields
| Field | Type | Meaning |
|---|---|---|
schema_version | string | Schema version of this listing (currently "0.1"). |
name | string | Service name. |
operator | string | Who runs it — org or pseudonym. |
description | string | What it does, one paragraph, machine-readable. |
service_url | string | Canonical URL of the service. |
capability_tags | string[] | What buyers search by, e.g. staking, solana, defi. |
endpoints | object[] | Each: path, method, input_schema, output_schema, example_request, example_response. |
auth_method | enum | "none" | "api-key" | "x402" | "signature". |
pricing_model | enum | "free" | "per-call" | "subscription" | "custom". |
pricing_detail | string | e.g. $0.05/call, first 1,000/day free. |
sla | string | e.g. 99.5% monthly, <500ms p95 — or best-effort. |
version | string | Semver of the service. |
verification_status | enum | "unverified" | "verified" | "verified-gold" — set by ExchangeRebel, not the operator. |
verification_date | string | ISO date of last verification. |
contact | string | Operator contact for disputes/updates. |
registered_at | string | ISO date the listing entered the registry. |
Example — a real listing from the registry
{
"schema_version": "0.1",
"name": "YieldRebel",
"operator": "Rebel Data",
"description": "Verified ETF distribution payouts \u2014 weekly, semi-monthly, and monthly payers with ex-date, record date, pay date, and per-share amounts, captured from issuers' official sources only.",
"service_url": "https://yieldrebel.com",
"capability_tags": [
"etf",
"distributions",
"income-data"
],
"endpoints": [
{
"path": "/data/latest.json",
"method": "GET",
"input_schema": "none",
"output_schema": "{\"as_of\": \"ISO date\", \"count\": \"int\", \"data\": [{\"ticker\", \"ex_date\", \"record_date\", \"pay_date\", \"dist_per_share_usd\", ...}]}",
"example_request": "GET https://yieldrebel.com/data/latest.json",
"example_response": "{\"as_of\": \"2026-10-08\", \"count\": 3384, ...}"
},
{
"path": "/data/distributions-{date}.csv",
"method": "GET",
"input_schema": "none",
"output_schema": "CSV: ticker, ex_date, record_date, pay_date, dist_per_share_usd, source",
"example_request": "GET https://yieldrebel.com/data/distributions-2026-10-08.csv",
"example_response": "CSV rows, one per distribution record"
},
{
"path": "/agents.json",
"method": "GET",
"input_schema": "none",
"output_schema": "machine-readable service description",
"example_request": "GET https://yieldrebel.com/agents.json",
"example_response": "{\"name\": \"YieldRebel\", \"endpoints\": [...]}"
}
],
"auth_method": "none",
"pricing_model": "free",
"pricing_detail": "Free \u2014 public data, no auth, no keys, no rate limits.",
"sla": "Best-effort; static snapshots, no uptime SLA.",
"version": "0.1",
"verification_status": "verified",
"verification_date": "2026-10-08",
"contact": "https://yieldrebel.com/methodology.html",
"registered_at": "2026-10-08"
}
Machine access
The live registry: /registry.json —
every listing above, validated against this schema on every site build.
ExchangeRebel