Business Overview
Brand green (--green, #299479) is NOT part of this token set
on purpose: it does not clear AA contrast for small body text
against a light background, so it stays reserved for links,
accents, labels, and heading-sized/bold text — never used as
a paragraph text color. Regular body copy always reads
through --text-primary / --text-secondary above so it flips
correctly between light and dark. */
--text-primary: var(--black);
--text-secondary: var(--gray-600);
--text-muted: var(--gray-400);
--page-bg: #ebebeb;
--surface-bg: #ffffff;
--surface-bg-alt: var(--gray-50);
--border-color: var(--gray-200);
--code-bg: var(--gray-100);
--code-text: #b91c1c;
--callout-bg: var(--green-bg);
--callout-text: #166534;
--callout-warn-bg: #fffbeb;
--callout-warn-text: #92400e;
--callout-info-bg: #eff6ff;
--callout-info-text: #1e40af;
color-scheme: light dark;
}
@media (prefers-color-scheme: dark) {:root { --text-primary: #f5f5f5; --text-secondary: #c7cad1; --text-muted: #8b8f98; --page-bg: #14161a; --surface-bg: #1c1f24; --surface-bg-alt: #22262c; --border-color: #33373e; --code-bg: #2a2e35; --code-text: #ff8a80; --callout-bg: #10251d; --callout-text: #86efac; --callout-warn-bg: #2a2110; --callout-warn-text: #fbbf24; --callout-info-bg: #101f2e; --callout-info-text: #93c5fd; }}
- {box-sizing: border-box; margin: 0; padding: 0;}
/* ── EMBED HARDENING ──────────────────────────────────
ReadMe.io's own theme CSS targets bare tags (h1, h2, p, etc.)
with its own color/opacity rules — sometimes as part of a
scroll-reveal fade that never resolves for content embedded
via a custom HTML block. Because it targets plain tags, not
our classes, generic text (headings, paragraphs) can render
near-invisible while our classed components (.how-card, etc.)
look fine. Scoping every rule under .px-isv and forcing
opacity/color with !important defeats that override. */
.px-isv, .px-isv * {opacity: 1 !important;}
.px-isv {background: var(--page-bg) !important; color: var(--text-primary) !important; font-family: var(--font); font-size: 14px;}
body {font-family: var(--font); background: var(--page-bg) !important; color: var(--text-primary) !important; font-size: 14px;}
/ ── CHROME ──────────────────────────────────────────── /
.site-header {background: var(--black); color: white !important;
padding: 13px 28px; display: flex; align-items: center; gap: 10px;
position: sticky; top: 0; z-index: 100; border-bottom: 2px solid var(--green);}
.logo {color: var(--green) !important; font-weight: 800; font-size: 15px;}
.sep {color: #333 !important;}
.crumb {color: #9ca3af !important; font-size: 13px;}
.spacer {flex: 1;}
.pill {background: #1a1a1a; border: 1px solid #333; color: #9ca3af !important; font-size: 11px; padding: 3px 10px; border-radius: 20px;}
.pill em {color: #fbbf24 !important; font-style: normal; font-weight: 700;}
.page-wrap {display: flex; min-height: 100vh;}
/ ── MAIN ────────────────────────────────────────────── /
.main {flex: 1; padding: 40px 52px 80px; max-width: 820px;}
/ ── TYPE ────────────────────────────────────────────── /
.px-isv h1 {font-size: 30px; font-weight: 800; color: var(--text-primary) !important; letter-spacing: -0.5px; line-height: 1.2; margin-bottom: 16px;}
.px-isv h2 {font-size: 18px; font-weight: 700; color: var(--text-primary) !important; margin: 44px 0 12px; padding-top: 8px; border-top: 1px solid var(--border-color);}
.px-isv h3 {font-size: 13.5px; font-weight: 700; color: var(--text-primary) !important; margin: 16px 0 7px;}
.px-isv p {margin-bottom: 12px; line-height: 1.75; color: var(--text-primary) !important;}
.px-isv ul {padding-left: 20px; margin-bottom: 12px;}
.px-isv li {margin-bottom: 5px; line-height: 1.6; color: var(--text-primary) !important;}
.px-isv a {color: var(--green) !important; text-decoration: none; font-weight: 500;}
.px-isv a:hover {text-decoration: underline;}
.px-isv code {font-family: var(--mono); font-size: 12px; background: var(--code-bg) !important; padding: 2px 5px; border-radius: 3px; color: var(--code-text) !important;}
.px-isv hr {border: none; border-top: 1px solid var(--border-color); margin: 36px 0;}
/ ── TABLES ──────────────────────────────────────────── /
.px-isv table {width: 100%; border-collapse: collapse; font-size: 13px; margin: 14px 0 20px; background: var(--surface-bg) !important;}
.px-isv thead tr, .px-isv thead {background: var(--black) !important;}
.px-isv th {padding: 9px 14px; text-align: left; font-weight: 700; font-size: 12px; color: var(--green-light) !important; background: var(--black) !important;}
.px-isv td {padding: 9px 14px; border-bottom: 1px solid var(--border-color); vertical-align: top; line-height: 1.55; color: var(--text-primary) !important; background: var(--surface-bg) !important;}
.px-isv tr:last-child td {border-bottom: none;}
.px-isv tr:nth-child(even) td {background: var(--surface-bg-alt) !important;}
/ ── CALLOUTS ────────────────────────────────────────── /
.callout {border-left: 3px solid var(--green); background: var(--callout-bg); color: var(--text-primary) !important;
padding: 12px 16px; border-radius: 0 8px 8px 0; margin: 14px 0; font-size: 13px; line-height: 1.65;}
.callout.warn {border-color: #d97706; background: var(--callout-warn-bg);}
.callout.info {border-color: #3b82f6; background: var(--callout-info-bg);}
.callout strong {font-size: 10px; text-transform: uppercase; letter-spacing: 0.07em; display: block; margin-bottom: 4px; color: var(--callout-text) !important; font-weight: 800;}
.callout.warn strong {color: var(--callout-warn-text) !important;}
.callout.info strong {color: var(--callout-info-text) !important;}
/ ── HOW IT WORKS ────────────────────────────────────── /
.how-cards {display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 14px; margin: 20px 0;}
.how-card {border: 1px solid var(--border-color); border-radius: 10px; padding: 18px; background: var(--surface-bg); position: relative;}
.how-card .step-num {width: 28px; height: 28px; background: var(--green); border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white !important; font-size: 12px; font-weight: 800; margin-bottom: 12px;}
.how-card .arrow {position: absolute; right: -19px; top: 50%; transform: translateY(-50%); color: var(--green) !important; font-size: 18px; font-weight: 700; z-index: 1;}
.how-card h3 {font-size: 13px; margin: 0 0 8px; color: var(--text-primary) !important;}
.how-card p {font-size: 12px; color: var(--text-secondary) !important; margin: 0; line-height: 1.55;}
/ ── STEP CARDS (numbered decisions) ─────────────────── /
.step-card {border: 1px solid var(--border-color); border-radius: 10px;
overflow: hidden; margin-bottom: 20px; background: var(--surface-bg);}
.step-card-header {display: flex; align-items: center; gap: 14px;
padding: 14px 20px; background: var(--black);}
.step-num-lg {width: 32px; height: 32px; border-radius: 50%;
background: var(--green); color: white !important;
display: flex; align-items: center; justify-content: center;
font-size: 14px; font-weight: 800; flex-shrink: 0;}
.step-card-header h3 {font-size: 14px; font-weight: 700; color: white !important; margin: 0;}
.step-card-header .step-sub {font-size: 12px; color: var(--gray-400) !important; margin-top: 2px;}
.step-card-body {padding: 20px 22px;}
.step-card-body p {font-size: 13.5px;}
.step-card-body p:last-child {margin-bottom: 0;}
/ ── OPTION SPLIT ────────────────────────────────────── /
.option-split {display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin: 14px 0;}
.option-box {border: 1px solid var(--border-color); border-radius: 8px;
padding: 16px; background: var(--surface-bg-alt);}
.option-box.highlighted {border-color: var(--green); background: var(--callout-bg);}
.option-label {font-size: 10px; font-weight: 800; text-transform: uppercase;
letter-spacing: 0.07em; color: var(--text-muted) !important; margin-bottom: 6px;}
.option-box.highlighted .option-label {color: var(--green) !important;}
.option-box h4 {font-size: 13px; font-weight: 700; margin-bottom: 6px; color: var(--text-primary) !important;}
.option-box p {font-size: 12.5px; color: var(--text-secondary) !important; margin: 0; line-height: 1.55;}
.option-box.highlighted p {color: var(--callout-text) !important;}
/ ── WALLET DIAGRAM (compact) ────────────────────────── /
.wallet-diagram {margin: 18px 0;}
.wd-center {display: flex; flex-direction: column; align-items: center;}
.wd-decision {background: var(--black); color: white !important; border-radius: 10px;
padding: 13px 28px; text-align: center; max-width: 360px; width: 100%;}
.wd-decision .wd-label {font-size: 10px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--green) !important; font-weight: 700; margin-bottom: 3px;}
.wd-decision .wd-title {font-size: 13.5px; font-weight: 700;}
.wd-decision .wd-sub {font-size: 11px; color: var(--gray-400) !important; margin-top: 3px;}
.wd-fork {display: flex; width: 100%; max-width: 680px;}
.wd-fork-l {flex: 1; height: 24px; border-right: 2px solid var(--border-color);}
.wd-fork-gap {width: 40px; flex-shrink: 0;}
.wd-fork-r {flex: 1; height: 24px; border-left: 2px solid var(--border-color);}
.wd-branches {display: flex; width: 100%; max-width: 680px; gap: 40px;}
.wd-branch {flex: 1; display: flex; flex-direction: column; align-items: center;}
.wd-conn {width: 2px; height: 18px; background: var(--border-color);}
.wd-model {border: 2px solid var(--green); background: var(--green-dark); color: white !important;
border-radius: 8px; padding: 13px 15px; text-align: center; width: 100%;}
.wd-model .wm-tag {font-size: 10px; font-weight: 800; color: var(--green-light) !important; letter-spacing: 0.06em; text-transform: uppercase; margin-bottom: 3px;}
.wd-model .wm-name {font-size: 13px; font-weight: 700; margin-bottom: 4px;}
.wd-model .wm-eg {font-size: 11px; color: var(--gray-400) !important; font-style: italic; margin-bottom: 7px;}
.wd-model .wm-desc {font-size: 11.5px; color: var(--gray-400) !important; line-height: 1.5;}
.wd-result {border-radius: 8px; padding: 10px 13px; text-align: center; width: 100%; font-size: 12px;}
.wd-result.plain {background: var(--surface-bg-alt); border: 1px solid var(--border-color);}
.wd-result.green {background: var(--callout-bg); border: 1px solid var(--green-light);}
.wd-result .wr-title {font-weight: 700; margin-bottom: 3px;}
.wd-result.plain .wr-title {color: var(--text-primary) !important;}
.wd-result.green .wr-title {color: var(--callout-text) !important;}
.wd-result .wr-desc {font-size: 11.5px; line-height: 1.5;}
.wd-result.plain .wr-desc {color: var(--text-secondary) !important;}
.wd-result.green .wr-desc {color: var(--callout-text) !important;}
/ ── NEXT NAV ────────────────────────────────────────── /
.next-nav {display: flex; justify-content: flex-end; margin-top: 48px; padding-top: 24px; border-top: 1px solid var(--border-color);}
.next-nav a {padding: 12px 20px; border: 1px solid var(--border-color); border-radius: 8px; display: flex; flex-direction: column; align-items: flex-end; text-decoration: none; color: var(--text-primary) !important;}
.next-nav a:hover {border-color: var(--text-primary);}
.next-nav .nav-label {font-size: 10px; color: var(--text-muted) !important; text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 3px;}
.next-nav .nav-title {font-size: 13px; font-weight: 700;}
Welcome to the ProphetX ISV!
ProphetX is a CFTC-regulated sports prediction market exchange. Through the ISV program, partners embed ProphetX's exchange infrastructure — markets, order execution, KYC, and settlement — directly into their own product. You own the product experience. ProphetX handles the regulated layer underneath.
Before you write any code, there are four integration decisions to work through with your ProphetX contact. This page walks you through each one. The API is REST-based with webhook delivery for real-time updates, all requests are authenticated, and sandbox credentials are available so you can test against a live-shaped environment before going to production.
How the integration works
Integrate to ISV APIs
Connect to ProphetX's ISV API suite — market data, user onboarding, order placement, and settlement webhooks — all server-to-server from your backend.
Four things to decide before you build
Work through these with your ProphetX contact during onboarding. Each decision affects how your integration is structured and what you need to build.
Your wallet model is set during commercial onboarding and cannot be changed at runtime. It determines how money moves between your platform and ProphetX — and whether you build your own payment flows or embed ProphetX's.
If you're on the Individual wallet model, ProphetX provides pre-built deposit and withdrawal modals you embed directly in your app. Users complete the deposit or withdrawal inside the modal — funds go directly to and from their individual ProphetX wallet. You never handle the money.
CFTC regulations require that every user trading on ProphetX has explicitly accepted ProphetX's Terms and Conditions. T&C acceptance must be captured and confirmed to ProphetX before a user can place their first trade. You have two options for how to handle this:
ProphetX T&C modal
ProphetX provides a pre-built T&C modal you surface as part of your onboarding flow. The user reviews and accepts the ProphetX T&C documents inside the modal. Acceptance is recorded with a timestamp and automatically confirmed to ProphetX. Nothing to build on your side.
Co-joined T&C page
If you want to combine ProphetX T&Cs with your own, you can design a single T&C page. ProphetX has specific design requirements for this approach — ProphetX branding must be prominently displayed on the page and on all T&C documents. Reach out to your ProphetX contact for the design requirements before building.
Even though you own the customer relationship, CFTC regulations require ProphetX to know and monitor every user trading on the platform at the individual level. User identity must be tied to every trade. ProphetX runs KYC and AML — you choose how user information gets to us.
You have two options depending on whether you already collect identity information from your users:
Send PII to ProphetX behind the scenes
If you already collect identity details from your users as part of your own onboarding, you can pass that information directly to ProphetX via the account creation API — no additional user-facing step required. ProphetX runs KYC and AML in the background and returns a status: PENDING, SUCCESS, or FAILURE. The user never sees ProphetX — it's entirely invisible to them.
Use the ProphetX Verified modal
ProphetX provides a Verified modal you can embed in your onboarding flow. The user enters their phone number and last 4 digits of their SSN — the modal then pulls their full KYC details automatically and presents them for confirmation. Once the user confirms, ProphetX runs KYC in the background. No manual data entry of full PII required.
How KYC statuses work
| Status | What it means | What to do |
|---|---|---|
PENDING | KYC check is in progress | Poll GET /private/v1/users/USERID/kyc until status resolves |
SUCCESS | User is verified and can trade | Proceed to T&C acceptance, then deposit (if Individual model) |
FAILURE | KYC could not be completed automatically | Direct user to contact [email protected] for manual review |
What's in these docs
| Section | What it covers |
|---|---|
| Technical Overview | Full technical orientation — request path, path prefixes, reading order, and the complete glossary. Read this before writing code. |
| User Management | Creating users, running KYC, recording T&C acceptance, and managing wallets. The four decisions above map directly to this section. |
| Order Management | Browsing fixtures and markets, placing market orders, and building parlays. |
| Push Integration | Registering a webhook receiver so ProphetX pushes order and settlement events to you in real time. |
| Frontend Integrations | Embedding ProphetX-hosted deposit, withdrawal, KYC, and T&C components. Relevant primarily for Individual wallet model partners. |
| Error Reference | All error codes, rate limits, and configuration constants. |
If anything is unclear or missing, reach out to your ProphetX integration contact. We'd rather hear from you early than have you guessing.
