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 h4 {font-size: 12px; font-weight: 700; color: var(--text-primary) !important; margin: 14px 0 6px; text-transform: uppercase; letter-spacing: 0.04em;}
.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;}
.step-card-body h4:first-child {margin-top: 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; text-transform: none; letter-spacing: normal; margin-top: 0;}
.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 prediction markets exchange, covering sports and elections. Through the ISV program, partners embed ProphetX's exchange infrastructure — markets, order execution, KYC, and settlement — directly into their own product.
The integration approach: you control the product experience; ProphetX manages regulatory compliance underneath. 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
Integration fundamentals
Work through these with your ProphetX contact during onboarding. Each setup affects how your integration is structured and what you need to build.
If you're on Managed Wallet: 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.
Every user must have a verified phone number and a verified email on file before they can trade, no matter which wallet model you're on — but how you get there is flexible. ProphetX supports three integration patterns, depending on how much of the onboarding UI you want to own:
| What you build | What you send | What you get back | Covers email verification? | |
|---|---|---|---|---|
| One-Click Modal | Nothing — embed our modal | Phone number + a challenge value (last 4 of SSN), entered inside the modal | A KYC result | No — you must verify email yourself, separately |
| Lookup-Assisted | Your own screens | Name, phone number, and a challenge question (DOB or last 4 of SSN) — same inputs as One-Click, just collected on your own UI | The full PII record we retrieve, plus a KYC result | No — same mechanism as One-Click |
| Full Self-Collection | Complete onboarding screens, including your own phone/email verification | The full data set, submitted to our KYC account-creation endpoint | A KYC result | Yes — it's part of your own flow |
The right fit depends on your priorities: One-Click is the fastest path if you don't have an onboarding flow yet and don't want to touch PII at all. Lookup-Assisted keeps your screens light while still giving you the full user record on your side. Full Self-Collection is the way to go if you already have (or want full control over) your own onboarding UX — and since you're the one collecting the address, run it through ProphetX's address-normalization endpoint before submitting; a malformed address is the most common cause of a failed KYC check on this path, and normalizing it upfront cuts failures significantly.
What happens after a failed check
A failed check isn't permanent, regardless of which path you're on: users get a limited number of retries, and if those run out, they're routed to document upload for manual review rather than left stuck. Worth noting: a failed attempt doesn't create a ProphetX account at all — no account exists until KYC succeeds.
Every user must explicitly accept ProphetX's Terms and Conditions before placing their first trade. T&C acceptance must be captured and confirmed to ProphetX.
On certain screens — Terms & Conditions, modals, trade entry, and trade confirmation — ProphetX requires a "Powered by ProphetX" message.
ProphetX sets up two shared Slack channels with each partner — one for dev, one for ops. Whenever an issue arises, it gets surfaced into the relevant channel.
The general model: your ops team communicates directly with your own customers most of the time. But there are specific instances where your customers receive communication directly from ProphetX instead — that's covered below.
When ProphetX contacts your customers directly
Deposit & withdrawal notifications
- Managed Wallet: ProphetX owns the payment providers and the user wallets, so we send automated transactional emails directly to users for deposits and withdrawals (confirmations, failures, etc.).
- Partner-Funded: you own the user wallets directly, so these emails don't apply — you're free to send whatever transaction notifications you'd like, in your own voice and on your own timing.
Direct outreach on negative account scenarios
This applies the same way regardless of wallet model. Beyond routine deposit/withdrawal confirmations, ProphetX sometimes needs to reach a user directly about something negative on their account — this spans a range of situations, not just KYC, including:
- Identity verification issues (document unreadable, underage, OFAC/PEP/deceased match)
- Payment problems (a declined deposit, a name mismatch on a payment method, a returned check, a chargeback)
- Account restrictions or closures (suspicious activity, multiple deposits/withdrawals with no trades, account closed by ProphetX)
- Compliance reviews (source-of-funds requests, terms-of-service review, promo requirement not met)
Once you've designed your UI/UX, integrated with our APIs, and tested the flows, you can reach out to us for a certification session. This happens over a call — you show us your screens, and we test through a set of scenarios together to confirm everything is working. If it is, we flip you over to production.
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 setups 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 Managed Wallet 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.
