Contracts
Issuing a contract
Write a line, set odds, post collateral, and cap your exposure.
A contract is a fixed-odds line you offer to the market. As the issuer you write the question, name the sides and set their decimal odds, post collateral to back the line, and cap how much you can lose. Anyone who takes the other side is a taker.
Issue one from the Create form (/markets/create), which posts to POST /api/v1/markets.
Before you start
| Requirement | Why |
|---|---|
| A signed-in account | Contracts are tied to your account as the creator. |
| A linked wallet | Required to post collateral and back your line. The form shows Connect your wallet until one is linked. |
MARKETS_WRITE scope |
If you drive Rivalizer through an API key, that key must carry this scope. |
Steps
- Pick a bet type (optional template). The form opens with a template picker grouped by category (Sports, Crypto, etc.). Choosing a template loads a tailored builder. The supported bet types are: spread, moneyline / head-to-head, total (over/under), player prop, outright, finishing order (exacta/trifecta), handicap, range/buckets, parlay, and yes/no prop.
- Pose the question. Fill the builder's bracketed fields. The form composes the contract title and the side labels for you and shows a live preview of what takers will see. You don't type the title directly — it is derived from your inputs.
- Set the outcomes and odds. Every contract needs 2 to 10 sides, each with a label and decimal odds greater than 1.00. Use the one-tap presets (1:2 → 1.50, Even → 2.00, 2:1 → 3.00, 3:1 → 4.00, 5:1 → 6.00) or type your own. The form translates decimals into plain language (e.g. "$1 wins $1.00 → $2.00 back · even money").
- Choose a category and optionally upload a card image (PNG/JPEG/WebP/GIF, max 5 MB).
- Write the resolution details (description). Spell out exactly how the contract settles so there's no ambiguity (e.g. "Settles on the official final score. Pushes refund both sides.").
- Post collateral and set capacity. See the table below.
- Set visibility — Public or Private. See Visibility.
- Optionally list it on your store. See Listing on your store.
- Choose a resolver. See Resolvers.
- Set the close date and time. The contract stops accepting takers at this moment. It must be in the future.
- Issue the contract. The button is disabled until every validation passes. Private contracts redirect you to the contract with the invite already in the URL.
Collateral & capacity
You back your own line. Both amounts are entered in USDC and stored as base units (the form multiplies your dollar input by 1,000,000 before sending maxExposure and totalCollateral).
| Field | Meaning | Required |
|---|---|---|
| Max exposure / capacity | Caps how much you can lose. It sets the total capacity rivals can take against your line. Must be greater than 0. | Yes |
| Initial collateral | The collateral posted up front to back the contract. | Optional (defaults to 0) |
The collateral token is the active chain's USDC, resolved from platform Chain settings (Base in production).
You can add collateral later with Deposit collateral (POST /api/v1/markets/:id/deposit-collateral) — issuer only, and only once the on-chain contract address is set.
Hosting fee: Issuers never set or receive a fee. The platform applies its own hosting fee automatically, read live from owner settings — you don't enter one.
Visibility
| Visibility | Who can see it | Notes |
|---|---|---|
| PUBLIC | Anyone; appears in the public marketplace. | Blocked for regular users when the platform is in invite-only mode (admins exempt). |
| PRIVATE | Only people with the invite code (plus you and admins). | Requires an invite code. See invites-and-private-contracts. |
Resolvers
Pick how the winning outcome is decided. Platform (ADMIN) is what's live — resolved by the Rivalizer team. The other options exist in the form:
| Resolver | Label | How it settles |
|---|---|---|
ADMIN |
Platform | Resolved by the Rivalizer team. (Live.) |
UMA |
Public oracle | Settled by the UMA optimistic oracle. |
CONSENSUS |
Judge consensus | A panel of judges votes. |
AI_JUDGE |
AI judge | An AI model adjudicates. |
Listing on your store
If you already have a store, the form shows a List on my storefront checkbox (on by default) that attaches the new contract to your store. The server verifies you own that store — you can only list a contract on a store you own. No store yet? The form links you to Create a store first. See stores-and-storefronts.
Editing while unaccepted, and lock-on-accept
You can edit a contract only while no one has taken it. Once anyone takes the other side, the contract locks and edits are rejected.
| State | Editable? |
|---|---|
| No positions and no open/matched trophy wagers | Yes — PATCH /api/v1/markets/:id |
| Anyone has accepted (a cash position or an open/matched trophy wager exists) | No — returns "This contract is locked — someone has already accepted it." |
| Resolved or cancelled | No |
While unaccepted, the issuer can change the title, description, category, close time, and add to / remove from a store (storeId). A settled contract can never be edited.
Other issuer actions:
- Close to new takers:
POST /api/v1/markets/:id/close(issuer only). - See who took it:
POST /api/v1/markets/:id/acceptors— lists every taker's side, stake, and acceptance time. Issuer (or admin) only.