Explainable Neurosymbolic AI Platform
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.
The problem with black-box AI
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.
How it works
Write your rules in plain English. AmberTrace generates an ontology — entities, relationships and symbolic rules.
Upload a CSV, or pull live from a built-in connector (FRED, Yahoo Finance, Coinbase, REST).
The rule set is checked for soundness; facts are gated by a confidence threshold τ.
Every query returns an Amber Report — answer, confidence, the rules that fired, and a proof certificate.
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
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?”
Check Applicant Age Below Threshold rule fires —
proof_checked: true, decision certified against the kernel.
Worked examples
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.
# 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?")
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?")
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?")
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?")
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?")
# 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})
# 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})
# 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
# 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"])
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"])
QQQ_rollmean_5 (0.40) and QQQ_lag_1 (0.24).The verified profile
A verified platform won’t hand you an answer it can’t prove.
proof_checked and a human-readable summary.# 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)."
Everything here — domains, ontologies, verified platforms, queries, forecasts, connectors — is a clean, typed SDK. No console clicks required.
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"]})
Describe your rules, bring your data, and get back decisions with proofs attached.
Get started at app.ambertrace.ai