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/observationsCited read of any series; series_id | series_prefix, from, to, as_ofanon/v1/oil/attributionWhy the pump price changed — retail change split into components; fuel_grade, from, toanonTry ▸/v1/fxFX rates; currency, rate_type, dateanon/v1/macroMacro indicator; indicatoranon/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/v1/insightsGrounded digest of the biggest recent movements — every insight cited; domain, lang, limitkey required/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_series_stats↔/v1/series/{id}/statsget_observations↔/v1/observationsget_ft_tariff↔/v1/ftget_oil_price_structure↔/v1/oilexplain_oil_price_change↔/v1/oil/attributionget_fx_rates↔/v1/fxget_macro_indicators↔/v1/macroget_freshness↔/v1/freshnessget_lineage↔/v1/observations/{id}/lineagelist_quarantine↔/v1/quarantineget_residency↔/v1/residencyask_veracle↔/v1/askget_insights↔/v1/insightsverify_product↔/v1/verifyextract_cert↔/v1/verify/extractverify_products_batch↔/v1/verify/batchget_verification_history↔/v1/verify/historyresolve_identifier↔/v1/identifiers/resolvescore_listing_risk↔/v1/risk/scoreextract_document↔/v1/documents/extractget_receipt↔/v1/receipts/{id}verify_receipt↔/v1/receipts/{id}/verifylist_jurisdictions↔/v1/jurisdictionslist_regulators↔/v1/regulatorssearch_standards↔/v1/standardsget_standard↔/v1/standards/{code}get_standard_equivalents↔/v1/standards/{code}/equivalentsestimate_carbon↔/v1/carbon/estimatecalculate_product_footprint↔/v1/carbon/footprintcalculate_org_inventory↔/v1/carbon/inventorylist_emission_factors↔/v1/carbon/factorslist_scope3_categories↔/v1/carbon/scope3-categoriescalculate_cbam_emissions↔/v1/cbam/calculaterender_cbam_communication↔/v1/cbam/communicationlookup_cn_code↔/v1/cbam/cn-codesestimate_export_readiness↔/v1/export-readiness/estimatelist_export_markets↔/v1/export-readiness/marketslist_products↔/v1/productsget_product↔/v1/products/{id}upsert_product↔/v1/productsreverify_product↔/v1/products/{id}/verifylist_alerts↔/v1/alertsacknowledge_alert↔/v1/alerts/{id}/acklist_cbam_installations↔/v1/cbam/installationslist_cbam_declarations↔/v1/cbam/declarationsget_cbam_declaration↔/v1/cbam/declarations/{id}calculate_cbam_declaration↔/v1/cbam/declarations/{id}/calculatelist_carbon_projects↔/v1/carbon/projectsget_carbon_project↔/v1/carbon/projects/{id}calculate_carbon_project↔/v1/carbon/projects/{id}/calculatelist_documents↔/v1/documentsget_document↔/v1/documents/{id}update_product↔/v1/products/{id}archive_product↔/v1/products/{id}mute_alert↔/v1/alerts/{id}/mutecreate_cbam_installation↔/v1/cbam/installationsupdate_cbam_installation↔/v1/cbam/installations/{id}archive_cbam_installation↔/v1/cbam/installations/{id}list_cbam_runs↔/v1/cbam/installations/{id}/runsget_cbam_run↔/v1/cbam/installations/{id}/runs/{run_id}add_cbam_runs↔/v1/cbam/installations/{id}/runs[/bulk]update_cbam_run↔/v1/cbam/installations/{id}/runs/{run_id}delete_cbam_run↔/v1/cbam/installations/{id}/runs/{run_id}create_cbam_declaration↔/v1/cbam/declarationsupdate_cbam_declaration↔/v1/cbam/declarations/{id}set_cbam_declaration_status↔/v1/cbam/declarations/{id}/statuslist_cbam_declaration_events↔/v1/cbam/declarations/{id}/eventsexport_cbam_declaration↔/v1/cbam/declarations/{id}/communication.xml | evidence.csvcreate_carbon_project↔/v1/carbon/projectsupdate_carbon_project↔/v1/carbon/projects/{id}set_carbon_project_status↔/v1/carbon/projects/{id}/statuslist_carbon_activities↔/v1/carbon/projects/{id}/activitiesadd_carbon_activities↔/v1/carbon/projects/{id}/activities[/bulk]delete_carbon_activity↔/v1/carbon/projects/{id}/activities/{activity_id}list_carbon_calculations↔/v1/carbon/projects/{id}/calculationsget_carbon_calculation↔/v1/carbon/projects/{id}/calculations/{calculation_id}review_document↔/v1/documents/{id}/reviewdelete_document↔/v1/documents/{id}create_webhook↔/v1/webhookslist_webhooks↔/v1/webhooksdelete_webhook↔/v1/webhooks/{id}Pick 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.