Prerequisites: What preprod does and does not simulate and
Test harness. You need a funded preprod pool and at least two KYC-approved test
participants before you start.
This page replaces the UAT framework that has lived in a Google Doc and a companion Sheet. Those
two artefacts are no longer the record. A completed copy of this checklist, with the evidence
attached, is.
The one contradiction you cannot resolve yourself
If you are an IB, this differs.
You have a gate with no ISV equivalent: the regulatory pack and the NFA/CFTC demo, with the
ten reports mapped to a source and the five unsupported ones escalated in writing — see
Reporting pack. Agree the demo environment before the date is
set, because you cannot demonstrate a settled market in preprod. You will also be asserting
record-level requirements (physical-person legal names, five-digit
postal_code, external_id
within 49 characters, all three identity strings labelled) and that no flow has your firm
receiving or holding customer funds.Connect
C8 is the single highest-value row on this page. A constructed participant ID fails
validateParticipantFirmOwnership and raises CROSS_ISV_PARTICIPANT_IMPERSONATION_ATTEMPT, a
CRITICAL security log and a cross-ISV access metric, against your own legitimate account.
Onboard
Fund
Trade
Rows T4, T5, T10 and T11 are the rows that have cost real money. T10 in particular: reading
commission_notional_collected one scale short turned a 1.00 on a 32-cent trade,
which exceeded a customer’s entire prefund and suppressed their refund.
The taker fee coefficient changed on 2026-09-14 and there is no fee-schedule endpoint, so every
partner hand-edited their systems. Pin the current coefficient from the published Fee Schedule on
the day you certify, record the value on your submission, and subscribe to the changelog.
→ Breaking changes and the changelog
Stream
Settle
Every row in this section is blocked in preprod, because markets do not resolve there. Agree with your reviewer which evidence substitutes.Operate
Sign-off
A submission with rows marked
Unresolved is still a valid submission. A submission that
silently picked a value instead is not.