Explainable Neurosymbolic AI Platform

Turn your data into explainable, proof-carrying AI.

AmberTrace AI builds a neurosymbolic platform from your data and a plain-English description of your rules. Every answer comes back as an Amber Report — a confidence breakdown, the symbolic rules that fired, and a machine-checked proof. Driven entirely through an SDK, so a person or their AI agent can build it.

pip install ambertraceai Decision + proof certificate Live data connectors Built by an AI agent

The problem with black-box AI

A neural answer you can’t audit is a liability.

In lending, healthcare, hiring and compliance, “the model said so” isn’t good enough. You need to know which rule fired, on which facts, and be able to prove the decision was sound.

  • Neural retrieval understands the question and finds relevant context.
  • Symbolic rules — generated from your description — enforce hard constraints.
  • The Amber Report shows both, fused, with a confidence-weighted answer.
  • The verified profile adds a machine-checked proof to every decision.
“De-risking the future of intelligence through immutable logic tracing.”

Every AI decision auditable, attributable, aligned — not because the model promises it, but because an independent kernel re-derives and certifies it.

How it works

From a CSV to a proof-carrying platform in five calls.

1

Describe the domain

Write your rules in plain English. AmberTrace generates an ontology — entities, relationships and symbolic rules.

2

Bring your data

Upload a CSV, or pull live from a built-in connector (FRED, Yahoo Finance, Coinbase, REST).

3

Build a verified platform

The rule set is checked for soundness; facts are gated by a confidence threshold τ.

4

Ask questions

Every query returns an Amber Report — answer, confidence, the rules that fired, and a proof certificate.

5

Forecast, too

Train prediction models on the same platform for time-series and what-if scenarios.

# pip install ambertraceai
from ambertraceai import AmbertraceAPI

api = AmbertraceAPI(
    base_url="https://app.ambertrace.ai",
    api_key="at_...",
)

# 1. Describe the domain — rules in plain English
domain = api.domains.create(
    name="Loan Approval Assessment",
    description="Applicants must be 18 or older; "
                "debt-to-income must not exceed 43%; ...",
)

# 2. Bring your data
ds = api.datasets.upload(domain_id=domain["id"],
                        file_path="loans.csv")

# 3. Build the ontology + a VERIFIED platform
api.domains.build_ontology(domain["id"])
platform = api.platforms.create(
    domain_id=domain["id"], dataset_id=ds["id"],
    verified_profile=True, verified_min_confidence=0.6,
)

# 4. Ask — every answer is a proof-carrying Amber Report
report = api.platforms.query(platform["id"],
    query="Can a 17-year-old apply for a £3,000 loan?")

print(report["proof_checked"])   # True — certified

Anatomy of an Amber Report

Not a score. A traceable decision.

A real response from the loan platform above, asked “Should we approve a loan — income £28,000, DTI 0.46, credit score 610, age 25?”

Amber Report✓ proof_checked
Confidence63%
Neural58%  (weight 0.4)
Symbolic67%  (weight 0.6)
Rules fired2 / 20
>>> Check Credit Score Exceeds Threshold
    credit score below 600 tier-2 floor
>>> Check Debt To Income Ratio Exceeds Threshold
    DTI 0.46 exceeds the 43% limit
PROOF CHECKED — Decision independently certified against the trusted kernel: 2 rule(s) fired, 2 fact(s) derived from 4 input fact(s).

Every report carries

  • A fused confidence — neural and symbolic, with their weights.
  • The neural trace — which knowledge-graph nodes were retrieved.
  • The symbolic trace — every rule evaluated, and which fired, with a reason.
  • A proof certificate — on verified platforms, an independent re-derivation.
  • Rejected facts — low-confidence inputs the verified gate refused to use.
Ask the same platform “Can a 17-year-old apply?” and the Check Applicant Age Below Threshold rule fires — proof_checked: true, decision certified against the kernel.

Worked examples

Eight domains, one workflow.

Each was built end-to-end against the live platform — a description, a dataset, a verified build, and queries that return proof-carrying Amber Reports. The forecasting domains pull live data straight from connectors.

Click any example to see the actual code.

Decision domains · verified & proof-carrying

verified

Loan approval

Age, debt-to-income, credit-score tiers
# Rules in plain English become an ontology
domain = api.domains.create(name="Loan Approval Assessment",
    description="Applicants must be 18 or older; debt-to-income "
                "must not exceed 43%; minimum credit score per loan "
                "tier; employment verification required.")
api.datasets.upload(domain_id=domain["id"], file_path="loan_applications.csv")
api.domains.build_ontology(domain["id"])
platform = api.platforms.create(domain_id=domain["id"], dataset_id=ds["id"],
    verified_profile=True, verified_min_confidence=0.6)

report = api.platforms.query(platform["id"],
    query="Can a 17-year-old with no income apply for a £3,000 loan?")
Live result  >>> Check Applicant Age Below Threshold fired · proof_checked: true
“Decision independently certified against the trusted kernel: 1 rule fired, 0 facts derived from 1 input fact.”

View full demo · 13_loan_assessment.py →

verified

Insurance fraud

Policy limits, early claims, high-frequency, collusion
domain = api.domains.create(name="Insurance Claims Fraud Detection",
    description="Claims exceeding the policy limit must be denied; "
                "claims filed within 90 days of policy start flagged; "
                "claimants with 4+ prior claims flagged high-frequency...")

report = api.platforms.query(platform["id"],
    query="A property flood claim for £55,000 on a £50,000 policy. Approve?")
Live result  >>> Check Policy Limit Exceeds Threshold (+2 rules) · proof_checked: true
“The claim of £55,000 exceeds the policy limit of £50,000 — it should not be approved in full.”

View full demo · 11_fraud_detection.py →

verified

Clinical prescribing

Interactions, contraindications, allergy cross-reactions
domain = api.domains.create(name="Clinical Prescribing Safety",
    description="Flag drug-drug interactions; block contraindicated "
                "medications (e.g. NSAIDs with chronic kidney disease); "
                "block allergy cross-reactions; flag elderly high-risk meds.")

report = api.platforms.query(platform["id"],
    query="Prescribe ibuprofen to an 82-year-old with chronic kidney disease?")
Run it  The NSAID-with-CKD contraindication is enforced on a verified build; the Amber Report names the rule and carries a proof certificate.

View full demo · 12_clinical_safety.py →

verified

Recruitment compliance

Age, salary bands, right-to-work, bias detection
domain = api.domains.create(name="HR Recruitment Compliance",
    description="Applicants must be 18+; salary within the role band; "
                "right to work required; references must pass; flag "
                "qualified candidates rejected without interview as bias.")

report = api.platforms.query(platform["id"],
    query="Can we hire a 16-year-old for a junior developer role?")
Live result  >>> Check Age Below Threshold fired · proof_checked: true
“There is a rule flagging applicants below 18 — a potential compliance issue for this hire.”

View full demo · 14_recruitment_compliance.py →

verified

Environmental compliance

Regulatory / permit breaches, protected zones
domain = api.domains.create(name="Environmental Regulatory Compliance",
    description="Readings must not exceed the regulatory or permit "
                "limit; facilities need an active permit; coastal-protected "
                "zones have stricter limits; breaches require enforcement.")

report = api.platforms.query(platform["id"],
    query="NO2 recorded at 44.8 ug/m3 against a 40.0 limit. In breach?")
Live result  >>> Calculate Measurement Value To Regulatory Limit Ratio · proof_checked: true
“Riverside Chemical Works is in breach — NO2 of 44.8 ug/m3 exceeds the 40.0 regulatory limit.”

View full demo · 15_environmental_compliance.py →

verified · 20k rows

Access-governance PDP

Classify-then-conclude policy chain — permit / deny, every decision proof-carrying
# 20k access requests. The policy is a chain: classify raw fields into named
# conditions (device trust, privilege, restricted zone), then conclude permit or
# deny — including the cross-field rule "deny when clearance < target sensitivity".
# The request is supplied as structured facts — the facts ARE the certified base.
domain = api.domains.create(name="Access Governance PDP", description="…")
platform = api.platforms.create(domain_id=domain["id"], dataset_id=ds["id"],
    verified_profile=True, verified_min_confidence=0.6)

report = api.platforms.query(platform["id"], query="Should this be permitted?",
    facts={"clearance_level": 2, "target_sensitivity": 3,
           "access_type": "write", "mfa_passed": True})
Live result  Decision: DENY · proof_checked: true
“Decision: Deny — access denied due to insufficient clearance level (clearance 2 is below the target sensitivity 3).”
Held-out: 100% decision accuracy, 100% certification across 50 requests.

View full demo · 18_access_governance.py →

Command & control · verified at scale

verified · 20k rows

Air-track identification & triage

Recognized air picture — clear / monitor / escalate, human in the loop
# 20k tracks; the request is supplied as structured facts (the facts ARE
# the certified base). Policy stated in the description — incl. the safety rule:
# "emergency tracks must always be escalated to a human operator."
domain = api.domains.create(name="Air Track Triage", description="…")
api.datasets.upload(domain_id=domain["id"], file_path="air_tracks.csv")
platform = api.platforms.create(domain_id=domain["id"], dataset_id=ds["id"],
    verified_profile=True, verified_min_confidence=0.6)

report = api.platforms.query(platform["id"], query="Triage this track.",
    facts={"iff_mode": "emergency", "squawk_emergency": True,
           "in_restricted_zone": False, "flight_plan_correlated": False})
Live result  Triage: ESCALATE · proof_checked: true — “Decision independently certified against the trusted kernel.”
Held-out: 98% three-way accuracy, 98% certification across 50 tracks; emergency tracks always escalate to an operator.

View full demo · 19_air_track_triage.py →

Forecasting · live data connectors

FRED

Bond-yield macro forecast

10-year Treasury yield from macro drivers
# Pull macro series live from the FRED connector
ds = api.datasets.fetch(domain_id=domain["id"], connector_type="fred",
    config={"series_ids": ["GS10","FEDFUNDS","CPIAUCSL","DCOILWTICO","UNRATE","M2SL"]})

cfg = api.predictions.create_config(platform["id"], target_field="GS10",
    time_index_field="date", horizon=1, frequency="monthly")
api.predictions.train(platform["id"], cfg["id"])

f = api.predictions.predict(platform["id"], prediction_config_id=cfg["id"],
    feature_overrides={"FEDFUNDS": 5.5})   # rate-hike scenario
Live result  Trained on monthly FRED data (pulled live); forecasts the 10-year yield under rate-hike, stagflation and crisis scenarios with prediction intervals.

View full demo · 20_bond_yield_forecast.py →

Coinbase

Bitcoin price forecast

BTC-USD with ETH-USD as a covariate
# Daily crypto closes, straight from Coinbase — no API key
ds = api.datasets.fetch(domain_id=domain["id"], connector_type="coinbase",
    config={"product_ids": ["BTC-USD", "ETH-USD"]})

cfg = api.predictions.create_config(platform["id"], target_field="BTC-USD",
    time_index_field="date", frequency="daily", feature_fields=["ETH-USD"])

f = api.predictions.predict(platform["id"], prediction_config_id=cfg["id"])
Live result  350 daily prices pulled live; the forecast responds to the ETH-USD covariate and returns a prediction interval that widens with volatility.

View full demo · 21_bitcoin_forecast.py →

Yahoo

Equity index forecast

SPY with QQQ as a covariate
ds = api.datasets.fetch(domain_id=domain["id"], connector_type="yahoo",
    config={"symbols": ["SPY", "QQQ"]})

cfg = api.predictions.create_config(platform["id"], target_field="SPY",
    time_index_field="date", frequency="daily", feature_fields=["QQQ"])
Live result  The engine auto-engineers features — top drivers were QQQ_rollmean_5 (0.40) and QQQ_lag_1 (0.24).

View full demo · 22_equity_forecast.py →

The verified profile

Fail-closed by design.

A verified platform won’t hand you an answer it can’t prove.

  • Certified-fact gating (τ). Inputs below the confidence threshold are rejected at the neural→symbolic boundary — and surfaced, not silently used.
  • A fail-closed engine. Rules are evaluated so that absence means “not derivable”.
  • A machine-checked proof. Every decision is independently re-derived; the answer carries proof_checked and a human-readable summary.
  • Build-time soundness. The rule set must be stratifiable and satisfy your safety/liveness invariants, or the build fails.
  • No proof, no answer. An uncertifiable query is refused rather than guessed.
# A fact below the threshold is rejected, not used
report["explanation"]["rejected_facts"]
#  → confidence 0.598 < threshold 0.600
#    "field not declared in the domain schema"

report["proof_checked"]    # True
report["proof_summary"]
# "Decision independently certified against the
#  trusted kernel: 2 rule(s) fired, 2 fact(s)
#  derived from 4 input fact(s)."

An API surface an agent can drive on its own.

Everything here — domains, ontologies, verified platforms, queries, forecasts, connectors — is a clean, typed SDK. No console clicks required.

  • Create scoped API keys per integration.
  • Poll jobs, build ontologies and platforms programmatically.
  • Get structured Amber Reports back as plain dictionaries.

The eight examples on this page were created by an AI agent working only from the public SDK and docs — the same path your agent would take.

# An agent provisions a narrow key, then builds
key = api.api_keys.create(scope="platform",
                          platform_id=platform["id"])

# ...and forecasts straight off a live connector
ds = api.datasets.fetch(domain_id=domain["id"],
        connector_type="coinbase",
        config={"product_ids": ["BTC-USD"]})

Build an AI system you can defend.

Describe your rules, bring your data, and get back decisions with proofs attached.

Get started at app.ambertrace.ai