synthetic cfo Back to synthetic cfo
The evaluator's guide

How to evaluate a detector on this data

The working guide for data scientists and audit analytics teams. Everything below is self-serve on the free plan; nothing needs a call.

Your first hour
1. Get a datasetCreate a free account and generate one (all three ERP platforms, up to 1,000 rows on the free plan), or start from the public sample, a complete package you can download in a minute.
2. Open the packageOne zip, four layers: an executive brief with the reproducibility certificate, audit evidence including Ground_Truth_Labels.csv (the answer key), a SQLite database with full referential integrity, and Excel workbooks mirroring the real ERP tables. Data teams can also take the Lab export from any job card, one JSONL file per table plus a dataset card and SHA-256 checksums.
3. Run your detectorPoint it at the database or the JSONL. Its job is to produce the list of record ids it believes are fraudulent, for example invoice document numbers or payment ids, exactly as they appear in the tables.
4. Score itIn the app, open Benchmark, pick your dataset or an official track, and paste the flagged ids. You get precision, recall, F1, a grade on a fixed ladder, and per-scheme recall, graded against the sealed answer key. Composite ids like a ghost vendor's id pair match on either part.
5. Read the grade honestlyThe grade bands F1: A at 0.90 or above, then B 0.75, C 0.50, D 0.25, F below. The full breakdown of what each band means in practice, worked on real numbers, sits on the proof page.
Why a score here means something
No peeking, structurallyEvaluation mode withholds every ground-truth marker from the database and workbooks and then verifies its own strip; a surviving marker fails the build. The answer key ships separately for scoring. A blind track goes further and withholds the key itself.
A detector can be wrongEvery fraud condition has innocent look-alikes by design: receivables that are simply not yet due, cheques voided for a misprint and reissued, rent with no purchase order, routine manual journals. Precision is measurable because false positives exist.
The fraud-free twinRegenerate any company with fraud set to none, same seed, empty answer key. Every flag on the twin is a false positive; that is your detector's noise floor on an innocent company.
Frozen tracks and a public barFive benchmark tracks whose configuration and seed never change, so scores stay comparable over time, with our own three detectors published as the baselines to beat on the leaderboard. Publishing your score is always your choice.
Provenance and reproducibility, in one paragraph

Every field is produced by deterministic Python from accounting rules; no language model generates any data, ever. The same seed and configuration regenerate a package byte for byte, the certificate in every package lists the SHA-256 of every file, and reproducing a package is free and never spends a generation. The security page covers the rest: app.syntheticcfo.com/security.

For pipelines and agents
Python clientStandard library only, no dependencies. Create an API key on your account page (Account, API access), then generate and download without a browser. Install it, or take it as a single file with curl -O https://app.syntheticcfo.com/sdk/syntheticcfo.py:
pip install syntheticcfo
from syntheticcfo import Client

c = Client(api_key="scfo_...")            # or set the SCFO_API_KEY env var
job = c.generate(platform="ORACLE", industry="RETAIL", fraud="high",
                 rows=600, modules=["P2P", "O2C"], seed=42, wait=True)
job.download("out/")                      # the four-layer audit package
job.lab_export("out/")                    # JSONL tables + answer key + dataset card
Raw HTTPAny client works. Send the key as an Authorization Bearer header to the same endpoints the app itself uses: create a job, poll it, download the package or the lab export, submit flagged ids for scoring. A key carries your plan and monthly allowance, and it can never manage the account that owns it.
MCP serverFor agent frameworks, an MCP server drives the engine programmatically: generate a dataset, inspect a package, read a table, query the answer key, reproduce.
Start now