Veracity + oracle — an AI-ready golden source for Thai & SEA energy and macro reference data. Normalized, citation-bearing and bitemporal, served to software and LLM agents over REST and MCP. This page is the full tour: concepts, the pipeline and a complete API reference.
Veracle's plumbing is real — ingestion, content-addressed archival, validation & reconciliation, the bitemporal store, citations, lineage, REST and MCP. But the values shown are representative synthetic fixtures; real ERC / EPPO / BOT data is gated on licensing. Every datapoint is still fully cited and traceable end-to-end, so you can evaluate exactly how the platform behaves. Bias by design: a false-positive quarantine over publishing a wrong value — trust over coverage.
For software developers (energy / fintech / industrial) and LLM agents that need verifiable, citeable reference numbers.
Public-but-painful energy & macro data, cleaned into consistent, typed series.
Every revision is kept; query the value as of any point in time.
Each value resolves to the exact archived source artifact (page/bbox).
Validated, reconciled, quarantine-gated — never publishes a disputed value.
A remote MCP server that agents call as their grounded, citeable source.
Every datapoint carries source_doc_uri, effective_date, as_reported_at, parser_confidence and a human-readable citation. The lineage endpoint resolves the full chain back to the raw archived artifact.
A remote MCP server exposes typed tools, so agents discover the catalog and read cited values directly — no scraping, verifiable citations.
Two time axes: valid-time (effective_date) and transaction-time (as_reported_at / ingested_at). Revisions are append-only; add ?as_of=YYYY-MM-DD for point-in-time reads.
Cross-source reconciliation (ERC authoritative, ±0.01; oil components must sum to retail), source-change detection (content-hash + layout signature), and quarantine — low confidence or failed validation is held, never served.
Every value's journey, source to served.
Docling for ERC Ft PDFs, Playwright for EPPO oil HTML, JSON for BOT FX/macro, fixtures for reference series.
The raw artifact is stored content-addressed on R2 first — before anything is parsed.
Range checks + period-over-period delta + reconciliation / sum-checks.
Anything low-confidence or failing validation is quarantined and never published.
Append-only revisions in Neon Postgres — nothing is overwritten.
Metered, cached, citation-bearing delivery over REST + MCP on Cloudflare Workers.
~73 series across 3 countries. Browse the full catalog live →
Anonymous works — no key needed (60 req/min by IP). Add X-API-Key: vk_… for the free tier (600/min); same data.
curl 'https://veracle-api.chaiyaphum.workers.dev/v1/series'
import { VeracleClient } from "@veracle/sdk";
const client = new VeracleClient({ baseUrl: "https://veracle-api.chaiyaphum.workers.dev", apiKey: "vk_..." });
const data = await client.listSeries();from veracle_sdk import VeracleClient client = VeracleClient(base_url="https://veracle-api.chaiyaphum.workers.dev", api_key="vk_...") data = client.list_series()
All GET unless noted · CORS open · auth anon unless marked. openapi.json
/v1/series/{id}One series' metadataanon/v1/observationsCited read of any series; series_id | series_prefix, from, to, as_ofanon/v1/observations/{id}/lineageFull provenance chain to the raw artifactanon/v1/exportsList bulk Parquet snapshotsanon/v1/exports/{id}/downloadSigned download URLkey required/v1/webhooksSubscribe to signed eventskey required/v1/auditYour audit trailscoped/openapi.jsonMachine-readable OpenAPIanonAgents discover the catalog and read cited values directly — no scraping.
POST https://veracle-mcp.chaiyaphum.workers.dev/mcp # dev: http://localhost:8788/mcp
list_series↔/v1/seriesget_series↔/v1/series/{id}get_observations↔/v1/observationsget_ft_tariff↔/v1/ftget_oil_price_structure↔/v1/oilget_fx_rates↔/v1/fxget_macro_indicators↔/v1/macroget_freshness↔/v1/freshnessPick your client, then paste the config. Claude Desktop has no native remote transport, so it uses the mcp-remote bridge.
{
"mcpServers": {
"veracle": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://veracle-mcp.chaiyaphum.workers.dev/mcp"
]
}
}
}Paste these into an agent's system prompt so it cites Veracle and uses point-in-time as_of correctly.
When you use a figure from Veracle, quote its `citation` string verbatim and never state a number without it. If unsure, call get_observations / get_ft_tariff and read the citation field before answering.
To answer 'what was X as reported on DATE', call get_observations(series_id, as_of=DATE). Revisions are append-only and bitemporal, so as_of reconstructs exactly what was known on that date — use it to avoid quoting a value that was only reported later.
User asks for the electricity Ft tariff. Call get_ft_tariff(period, customer_class); return value + unit + the human-readable citation, and offer source_doc_uri so the user can verify the original document.
Limits only — every tier returns identical data and identical citations.
none (by IP)60 / minX-API-Key: vk_…600 / minAuthorization: Bearer (OAuth)6000 / minX-Veracle-TierX-RateLimit-LimitX-RateLimit-RemainingX-CacheX-Veracle-ResidencyX-Request-IdAnatomy of a cited datapoint
{
"observation_id": 27,
"series_id": "th.energy.electricity.ft.general",
"value": 0.3672,
"unit": "THB/kWh",
"effective_date": "2025-01-01",
"as_reported_at": "2024-12-15T09:00:00Z",
"ingested_at": "2024-12-16T02:11:00Z",
"revision_id": 1,
"is_current": true,
"parser_confidence": 0.98,
"source_id": "erc",
"source_doc_uri": "r2://veracle-raw-artifacts/erc/ft/8a1f….pdf",
"citation": "ERC electricity Ft — general class, Jan–Apr 2025: 0.3672 THB/kWh. Source: ERC announcement (p.2)."
}GET /v1/observations/{id}/lineage resolves source → archived document; derived series expand into the input observations they were computed from. Trace any live datapoint in the Explorer →
$ npm i @veracle/sdk
import { VeracleClient } from "@veracle/sdk";
const client = new VeracleClient({ baseUrl, apiKey: "vk_…" });
const ft = await client.getFtTariffs({ period: "2025-01" });$ pip install veracle
from veracle_sdk import VeracleClient
with VeracleClient(base_url=base, api_key="vk_…") as client:
ft = client.get_ft_tariffs(period="2025-01")No — synthetic demo fixtures today. Real ERC / EPPO / BOT sources are gated on licensing. The plumbing, citations and lineage are fully real.
Declarative, software-level: every response carries X-Veracle-Residency: TH:asia-southeast1; full disclosure at GET /v1/residency.
It is quarantined and never published — trust over coverage.
They are clearly-labelled OLS estimates with a confidence band — not observations.
No — anonymous works at 60 req/min. Add an API key for the free tier (600/min); same data.