bulldial

Developers

The index, over HTTPS

A crowd-behaviour index with zero price-derived inputs, an append-only archive, and point-in-time reconstruction. Keyed, metered, versioned under /v1/.

Base https://bulldial.com/v1
GET /v1/health
$ curl https://bulldial.com/v1/health

Authentication

Send the key with every request, either way. Keys are stored hashed; a lost key is reissued, never recovered. Three endpoints are public and need no key: /v1/health, /v1/meta/tiers, /v1/meta/methodology.

$ curl -H "Authorization: Bearer $KEY" https://bulldial.com/v1/fomo/current
$ curl -H "X-API-Key: $KEY" https://bulldial.com/v1/fomo/current

Every metered response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (midnight UTC). Past the limit the API returns 429 with the tier and the count, not a dropped connection.

Tiers

Full pricing

Endpoints

EndpointReturnsTier
GET /v1/healthLiveness, version, methodology tagpublic
GET /v1/meta/methodologyEvery component, constant, band and guaranteepublic
GET /v1/meta/tiersThis page's tier table, as datapublic
GET /v1/fomo/currentToday's reading, band, confidencefree
GET /v1/fomo/history?start=&end=The full daily seriespro
GET /v1/fomo/componentsPer-component decomposition of today's numberpro
GET /v1/fomo/mechanismsMechanism scores, dispersion, confidencepro
GET /v1/fomo/divergenceThe index against price, and the gappro
GET /v1/fomo/signalsReading plus the recent event streampro
GET /v1/fomo/events?since=&limit=Band changes, spikes, divergence opens/closespro
GET /v1/fomo/narrativesTheme concentration over the live corpuspro
GET /v1/fomo/asof/{date}?knowledge_date=Point-in-time reconstruction, no lookaheadquant
GET /v1/series/{id}?knowledge_date=Raw component series at any past vintagequant
GET /v1/series/{id}/revisionsHow often the upstream rewrote its pastquant
GET /v1/meta/sourcesProvenance and licence verdict per seriesany key
GET /v1/meta/usageYour own call counts, last 30 daysany key

The point-in-time guarantee

/v1/fomo/asof/{date} recomputes the index from observations recorded on or before knowledge_date and nothing else. No value revised after that date is used, so the reading contains no lookahead. If nothing was knowable by that date the endpoint says so and returns null — it never substitutes later-known values.

/v1/series/{id}/revisions is the same property inside out: it counts the dates each upstream source restated after we first recorded them. The archive is append-only and bitemporal; that is what makes both answers possible.

GET /v1/fomo/asof/2026-06-01
{
  "value": 41.7,
  "point_in_time": {
    "as_of": "2026-06-01",
    "knowledge_date": "2026-06-01",
    "guarantee": "Computed only from observations
      recorded on or before knowledge_date…"
  }
}

Quickstart

shell
# today's reading
$ curl -s -H "Authorization: Bearer $KEY" \
    https://bulldial.com/v1/fomo/current

# the series, June onward
$ curl -s -H "Authorization: Bearer $KEY" \
    "https://bulldial.com/v1/fomo/history?start=2026-06-01"

CORS is open on /v1/: browser clients work without a proxy. Free-tier responses carry an attribution field; showing the number in public requires showing "FOMOmeter by bulldial.com" beside it.

Errors

StatusMeaningBody carries
401No key, or a revoked oneA hint naming both accepted headers
403Your tier lacks the scopeThe scope name and /v1/meta/tiers
429Daily quota exhaustedTier, calls used; resets midnight UTC
503No reading published for the dateNothing is imputed, ever